线程安全终止
取消一个线程的方式是向其发送pthread_cancel信号。目标线程接收到这个信号之后会采取动作,具体的动作取决于线程开始时以下几个函数的设定:
1)Int pthread_setcancelstate(int state,int * oldstate);
这个函数用来设定本线程对cancel信号反应,state有两种值:PTHREAD_CANCEL_ENABLE。分别表示收到信号设置为CANCEL状态和忽略CANCEL信号继续运行。
2)int pthread_setcanceltype(int type,int * oldtype);
设置本线程取消时机,type取两种值:PTHREAD_CANCEL_DEFFERED和PTHREAD_CANCEL_ASYCHRONOUS,分别表示先设置一个cancel状态再运行到下一个取消点的时候取消或者立即执行取消动作,当cancel状态为enable的时候有效。
使用void pthread_testcancel(void)可以设置一个取消点。只有当线程取消功能处于启用状态且取消状态设置为延迟状态时,pthread_testcancel()函数有效。
当然,这不可避免的设计到资源释放的问题,资源释放可以用到以下几个函数:
Void pthread_cleanup_push(void (* routine)(void *),void * arg);
Void pthread_cleanup_pop(int execute);
这几个函数用来做资源释放,对于运行在两个函数之间的代码被终止(pthread_exit或者取消点),将执行pthread_cleanup_push()中所指定的清理函数。