4. API 比较细节 |
在Solaris 线索中不支持此函数。
#include <pthread.h>
int pthread_cancel (pthread_t tid)
int pthread_setcanceltype (int type, int *oldtype)
int pthread_setcancelstate (int state, int *oldstate)
void pthread_cleanup_push (void (*routine) (void *), void *arg)
void pthread_cleanup_pop (int execute)
void pthread_testcancel()
pthread_t tid;
int ret;
ret = pthread_cancel (tid);
可以推迟或者在异步模式中设置撤消类型。缺省情况,当创建一个线索时,撤消类型设置为推迟模式。在推迟模式,仅在撤消点才能撤消线索。在异步模式,线索可以在它执行期间的任何点撤消。不鼓励使用异步模式。
int oldtype;
int ret;
ret = pthread_setcanceltype (PTHREAD_CANCEL_DEFERED, &oldtype); /* deferred mode */ ret = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype); /* async mode*/
一个线索的可撤消性可以被使能或者禁止。缺省情况,当创建一个线索时,可撤消性是使能的。
int oldstate;
int ret;
ret = pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, &oldstate); /* enabled */
ret = pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &oldstate); /* disabled */
在一个程序的同一语句范围中压栈和弹栈清除句柄。它们应该总是匹配;否则将会产生编译错误。弹处函数中的非零参数将从堆栈中移走句柄,并且执行它。如果它为零,那么弹出句柄,而不执行它。
ret = pthread_cleanup_push (func, arg); /* push the handler "func" on cleanup stack */
ret = pthread_cleanup_pop (1); /* pop the "func" out of cleanup stack and execute "func" */
ret = pthread_cleanup_pop (0); /* pop the "func" and DONT execute "func" */
在一个线索的执行期间,pthread_testcancel() 提供一个撤消点。仅应将它插入到对于撤消一个线索是安全的序列中。当可撤消性是使能的和在推迟模式中时,它是有效的。当可撤消性是禁止时,调用此函数是无效的。
pthread_testcancel();
Copyright: NPACT |