当前位置:   article > 正文

pthread_cancel()和取消点_pthread_cancel 内部是发送信号么?

pthread_cancel 内部是发送信号么?

 总结: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();
  • 1
  • 2
  • 3

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

相关参考:http://blog.chinaunix.net/uid-20338767-id-172676.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/304697
推荐阅读
相关标签
  

闽ICP备14008679号