分类: 系统运维
2012-03-31 23:16:47
没有包含在pthread_attr_t结构体里的两个线程属性是取消状态和取消类型。这些属性影响了一个线程响应pthread_cancel(11.5节)调用的行为。
响应状态属性可以是PTHREAD_CANCEL_ENABLE或PTHREAD_CANCEL_DISABLE。一个线程可以改变它的取消状态,通过调用pthread_setcancelsatate。
在一个原子操作里,pthread_setcancelstate设置当前的取消状态为state,并存储之前的取消状态到oldstate所指的内存位置。
回 想11.5节,一个pthread_cancel的调用不等待一个线程的终止。在默认情况下,线程将在取消请求发出后继续执行,直到这个线程到达取消点。 一个取消点是线程检查它是否被取消并执行这个请求的位置。POSIX.1保证取消点将发生在当一个线程调用下表列出的任何函数时。
| accept | mq_timedsend | putpmsg | sigsuspend |
| aio_suspend | msgrcv | pwrite | sigtimedwait |
| clock_nanosleep | msgsnd | read | sigwait |
| close | msync | readv | sigwaitinfo |
| connect | nanosleep | recv | sleep |
| creat | open | recvfrom | system |
| fcnt12 | pause | recvmsg | tcdrain |
| fsync | poll | select | usleep |
| getmsg | pread | sem_timedwait | wait |
| getpmsg | pthread_cond_timedwait | sem_wait | waitid |
| lockf | pthread_cond_wait | send | waitpid |
| mq_receive | pthread_join | sendmsg | write |
| mq_send | pthread_testcancel | sendto | writev |
| mq_timedreceive | putmsg | sigpause |
除了上表列出的函数,POSIX.1还列出下表中的函数作为可选取消点。
| catclose | ftell | getwc | printf |
| catgets | ftello | getwchar | putc |
| catopen | ftw | getwd | putc_unlocked |
| closedir | fwprintf | glob | putchar |
| closelog | fwrite | iconv_close | putchar_unlocked |
| ctermid | fwscanf | iconv_open | puts |
| dbm_close | getc | ioctl | pututxline |
| dbm_delete | getc_unlocked | lseek | putwc |
| dbm_fetch | getchar | mkstemp | putwchar |
| dbm_nextkey | getchar_unlocked | nftw | readdir |
| dbm_open | getcwd | opendir | readdir_r |
| dbm_store | getdate | openlog | remove |
| dlclose | getgrent | pclose | rename |
| dlopen | getgrgid | perror | rewind |
| endgrent | getgrgid_r | popen | rewinddir |
| endhostent | getgrnam | posix_fadvise | scanf |
| endnetent | getgrnam_r | posix_fallocate | seekdir |
| endprotoent | gethostbyaddr | posix_madvise | semop |
| endpwent | gethostbyname | posix_spawn | setgrent |
| endservent | gethostent | posix_spawnp | sethostent |
| endutxent | gethostname | posix_trace_clear | setnetent |
| fclose | getlogin | posix_trace_close | setprotoent |
| fcntl | getlogin_r | posix_trace_create | setpwent |
| fflush | getnetbyaddr | posix_trace_create_withlog | setservent |
| fgetc | getnetbyname | posix_trace_eventtypelist_getnext_id | setutxent |
| fgetpos | getnetent | posix_trace_eventtypelist_rewind | strerror |
| fgets | getprotobyname | posix_trace_flush | syslog |
| fgetwc | getprotobynumber | posix_trace_get_attr | tmpfile |
| fgetws | getprotoent | posix_trace_get_filter | tmpnam |
| fopen | getpwent | posix_trace_get_status | ttyname |
| fprintf | getpwnam | posix_trace_getnext_event | ttyname_r |
| fputc | getpwnam_r | posix_trace_open | ungetc |
| fputs | getpwuid | posix_trace_rewind | ungetwc |
| fputwc | getpwuid_r | posix_trace_set_filter | unlink |
| fputws | gets | posix_trace_shutdown | vfprintf |
| fread | getservbyname | posix_trace_timedgetnext_event | vfwprintf |
| freopen | getservbyport | posix_typed_mem_open | vprintf |
| fscanf | getservent | pthread_rwlock_rdlock | vwprintf |
| fseek | getutxent | pthread_rwlock_timedrdlock | wprintf |
| fseeko | getutxid | pthread_rwlock_timedwrlock | wscanf |
| fsetpos | getutxline | pthread_rwlock_wrlock |
如果你的应用在很长时间内没有调用上面两个表中的某个函数(比如受计算机限制),那么你可以调用pthread_testcancel来在你的程序里加入你自己的取消点。
当你调用pthread_testcancel时,如果一个取消请求已经待定,且取消没有被禁止,那么线程将被取消。当取消被禁止时,调用pthread_testcancel没有效果。
我们已经描述过的默认取消类型被称为延迟取消。在pthread_cancel调用后,真实的取消不会发生,直到线程碰到一个取消点。我们可以调用pthread_setcanceltype来改变取消类型。
type参数可以是PTHREAD_CANCEL_DEFERRED或PTHREAD_CANCEL_ASYNCHRONOUS。pthread_setcanceltype函数设置取消类型为type并返回之前的类型到oldtype所指的整型。