分类: 系统运维
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所指的整型。