https://www.cnblogs.com/tianzeng/p/9195091.html
- pthread_setcancelstate: 对于cancel信号,线程有两种方法: 忽略,和响应。默认是响应
- pthread_setcanceltype: 接收到cancel信号,线程有两种处理类型: 立即响应 和 延迟响应(在最近的取消点响应),默认是延迟响应
取消点
- pthread_testcancel:可以用该函数设置取消点
- 根据POSIX标准,pthread_join()、pthread_testcancel()、pthread_cond_wait()、pthread_cond_timedwait()、sem_wait()、sigwait()等函数以及read()、write()等会引起阻塞的系统调用都是取消点
取消
当一段代码被取消时需要恢复一些状态,必须使用清除处理器,当线程在等待一个条件变量时被取消,他将被唤醒,并保持互斥量的加锁状态,在线程终止前,通常需要恢复不变量,总是需要释放互斥来量。
可以把每一个线程考虑为有一个活动的清除处理函数的栈,用pthread_cleanup_push将清除处理函数加入到栈,pthread_cleanup_pop删除最近添加的处理函数,当线程被取消或调用pthread_exit时,pthread从最近增加清除处理函数开始,依次调用各个活动的清除处理函数。
清除处理函数也可以设计为线程被取消时,也能经常使用清除处理函数,不论取消是否正常完成,当pthread_cleanup_pop以非零值调用时就算线程没被取消,清除处理函数也要被执行