Linux_UNIX编程手册-读书笔记-第三十二章(线程:线程取消)
32.1 取消一个线程
函数pthread_cancel()向由thread指定的线程发送一个取消请求
发出取消请求后,函数会当即返回,不会等待目标线程的退出。
32.2 取消状态及类型
下面两个函数会设定标志,允许线程对取消请求的响应过程加以控制。
函数pthread_setcancelstate()会将调用线程的取消性状态置为参数state所给定的值。
state:
32.3 取消点
若将线程的取消性状态和类型分别置为启用和延迟,仅当线程抵达某个取消点时,取消请求才会起作用。取消点既是对由实现定义的一组函数之一加以调用。
下表大部分函数都有能力将线程无期限地阻塞起来。
看到这里还没看懂取消点到底是个啥???
32.4 线程可取消性的检测
假设线程执行的是一个不含取消点的循环,这时,线程永远也不会响应取消请求。
pthread_testcancel()的目的很简单,就是产生一个取消点。线程如果已有处于挂起状态的取消请求,那么只要调用该函数,线程就会随之终止。
32.5 清理函数(cleanup handler)
为什么需要清理函数:
每个线程都可以拥有一个清理函数栈。当线程遭取消时,会沿该栈自顶向下依次执行清理函数,执行完之后,线程终止。
所以就有了下面两个函数:
这里有一个疑问: 这个函数和atexit有啥区别?
通常,线程如在执行一段特殊代码时遭到取消,才需要执行清理动作。如果线程顺利执行完这段代码而未遭取消,那么就不在需要清理。
SUSv3将这两个函数实现为宏,这意味着配对的这两个函数必须属于同一个语法块。
这句话也不太懂
32.6 异步取消
如果设定线程为可异步取消时,可以在任何时点将其取消,取消动作不会拖延到下一个取消点才执行。
BALABALA一堆又说不能用。