伪代码描述如下:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void* subThread(void*) { pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&oldCancleState); …;//不存在获取临界资源操作,可以安全退出的代码块 pthread_testcancel();//如果可以安全退出的代码块不存在取消点操作,可以自己添加pthread_testcancel调用,线程执行到这个调用就会退出 /*还有一种方法,在可以安全退出的代码块,我们将线程的可取消类型设置成PTHREAD_CANCEL_ ASYNCHRONOUS,这样即使没有取消点也可以马上退出*/ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,&oldCancleState); /*存在获取-释放临界资源操作,如果在lock和unlock之间的运行收到cancel信号,且可取消状态为enable,则锁永远无法被释放*/ Lock(); …; Unlock(); } void* mainThread(void*) { pthread_cancel(subThread);//给subThread发送退出信号 pthread_join(subThread,null);//进入休眠,直到subThread退出成功 } |
无论使用哪种方式,核心点就是要保证线程退出的时候不会获取了某些临界资源而无法释放
POSIX.1定义的取消点见下:
注意:当主线程调用pthread_cancel接口后,只是将取消请求发送给指定线程,