一般情况下,线程在其主函数退出时自动终止,但同时也可以因为接收到另一个线程发来的取消请求而终止.
线程取消的方法是 向目标线程发出一个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()的调用.