旅途

如果想飞得高,就该把地平线忘掉

取消线程

一般情况下,线程在其主函数退出时自动终止,但同时也可以因为接收到另一个线程发来的取消请求而终止.
线程取消的方法是 向目标线程发出一个cancel信号,但如何处理cancel信号则是由目标线程自己决定,或者忽略,或者立即终止,或者继续运行到cancelation-point(取消点),由不通的cancellation状态决定.
竭诚接收到cancel信号的默认处理是继续运行到取消点,也就是说摄制一个canceled状态,线程继续运行,只有运行到cancelation-point的时候才会退出.

取消点:根据posix的标准,pthread_join,pthread_testcancel,pthread_cand_wait, pthread_cond_timedwait,sem_wait,sigwait等函数以及read,write等会引起堵塞的调用都是 cancelation-point,而其他的pthread函数都不会引起cancelation动作,但pthread_cancel的手册说明, linuxthread的库与C库结合的并不是很好,因而目前的C函数库都不是cancelation-point,但cancel信号会使线程从堵塞的 系统调用中退出.并设置EINTR错误码,因此可以在需要作为cancelation-point的系统调用前后调用 pthread_testcancel,从而达到POSIX的标准,例如
pthread_testcancel();
retcode=read(fd,buffer,length);
pthread_testcancel();


程序设计的考虑:
如果线程处于无限的循环中且循环没有执行到取消点的必然路径,则线程无法由于外部的其他线程的取消请求而终止,因此,在这样的循环体中的必经路径上加上pthread_testcancel()的调用.

posted on 2007-08-11 01:42 旅途 阅读(264) 评论(0)  编辑 收藏 引用 所属分类: Linux开发


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理