您的位置:首页 > 其它

pthread_cancel()和取消点

2015-07-12 23:02 369 查看
 总结:pthread_cancel()函数会向线程发送一个取消信号,当线程被设置为异步取消(pthread_setcanceltype设置),那么线程会结束,如果有cleanup函数就执行完cleanup结束;如果线程不是异步取消,那么线程会继续执行直到最近的下一个取消点结束;线程也可以设置为忽略取消信号。

 线程在执行过程中,会在一些地方检测是否有未响应的取消信号,这些地方就叫取消点。取消点一般是可以引起阻塞。根据POSIX标准,pthread_join()、pthread_testcancel()、pthread_cond_wait()、pthread_cond_timedwait()、sem_wait()、sigwait()等函数以及read()、write()等会引起阻塞的系统调用都是Cancelation-point,而其他pthread函数都不会引起Cancelation动作。但是pthread_cancel的手册页声称,由于Linux线程库与C库结合得不好,因而目前C库函数都不是Cancelation-point;但CANCEL信号会使线程从阻塞的系统调用中退出,并置EINTR错误码,因此可以在需要作为Cancelation-point的系统调用前后调用pthread_testcancel(),从而达到POSIX标准所要求的目标,即如下代码段:

pthread_testcancel();
retcode = read(fd, buffer, length);
pthread_testcancel();


 但是从RedHat9.0的实际测试来看,至少有些C库函数的阻塞函数是取消点,如read(),getchar()等,而sleep()函数不管线程是否设置了pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL),都起到取消点作用。总之,线程的取消一方面是一个线程强行杀另外一个线程,从程序设计角度看并不是一种好的风格,另一方面目前Linux本身对这方面的支持并不完善,所以在实际应用中应该谨慎使用!!

相关参考:http://blog.chinaunix.net/uid-20338767-id-172676.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: