赞
踩
总结: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本身对这方面的支持并不完善,所以在实际应用中应该谨慎使用!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。