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标准所要求的目标,即如下代码段:
但是从RedHat9.0的实际测试来看,至少有些C库函数的阻塞函数是取消点,如read(),getchar()等,而sleep()函数不管线程是否设置了pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL),都起到取消点作用。总之,线程的取消一方面是一个线程强行杀另外一个线程,从程序设计角度看并不是一种好的风格,另一方面目前Linux本身对这方面的支持并不完善,所以在实际应用中应该谨慎使用!!
相关参考:http://blog.chinaunix.net/uid-20338767-id-172676.html
线程在执行过程中,会在一些地方检测是否有未响应的取消信号,这些地方就叫取消点。取消点一般是可以引起阻塞。根据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
相关文章推荐
- Java基础学习之final和多态及类型转换
- Oracle ->> 查看分区表的每个分区的数据行分布情况
- IOS tableview 消除 分割线短 15 像素 ios8方法 swift版
- Java实现基于内容的数字图像处理代码
- android:Activity、View和Window的关系(一)
- ubuntu下wifi图标不见了
- 用C# 调用PowerShell 3.0
- Spring AOP之动态代理原理解析
- HDU 1171 Big Event in HDU (多重背包变形)
- 关于CDialog::DoModal
- 交叉引用的解决方法——类声明的应用
- HT for Web列表和3D拓扑组件的拖拽应用
- Xcode histogram图像显示测试
- OLAP 支持---ROLLUP和CUBE语句 group by 的增强版本语句!可进行分层分组模式外 (小计与总计)
- android入门学习-UML(统一建模语言)介绍
- SQL Server ->> 分区表上创建唯一分区索引
- Section 1.3
- 适配器模式Adapter、外观模式Facade-- 学习HeadFirst设计模式记录
- Lowest Common Ancestor of a Binary Search Tree
- 对比iOS中的四种数据存储