Linux_UNIX编程手册-读书笔记-第三十二章(线程:线程取消)

32.1 取消一个线程

函数pthread_cancel()向由thread指定的线程发送一个取消请求
Linux_UNIX编程手册-读书笔记-第三十二章(线程:线程取消)

发出取消请求后,函数会当即返回,不会等待目标线程的退出。

32.2 取消状态及类型

下面两个函数会设定标志,允许线程对取消请求的响应过程加以控制。
Linux_UNIX编程手册-读书笔记-第三十二章(线程:线程取消)
函数pthread_setcancelstate()会将调用线程的取消性状态置为参数state所给定的值。
state:
Linux_UNIX编程手册-读书笔记-第三十二章(线程:线程取消)

32.3 取消点

若将线程的取消性状态和类型分别置为启用和延迟,仅当线程抵达某个取消点时,取消请求才会起作用。取消点既是对由实现定义的一组函数之一加以调用。

下表大部分函数都有能力将线程无期限地阻塞起来。
Linux_UNIX编程手册-读书笔记-第三十二章(线程:线程取消)
看到这里还没看懂取消点到底是个啥???

32.4 线程可取消性的检测

假设线程执行的是一个不含取消点的循环,这时,线程永远也不会响应取消请求。

pthread_testcancel()的目的很简单,就是产生一个取消点。线程如果已有处于挂起状态的取消请求,那么只要调用该函数,线程就会随之终止。
Linux_UNIX编程手册-读书笔记-第三十二章(线程:线程取消)

32.5 清理函数(cleanup handler)

为什么需要清理函数:
Linux_UNIX编程手册-读书笔记-第三十二章(线程:线程取消)

每个线程都可以拥有一个清理函数栈。当线程遭取消时,会沿该栈自顶向下依次执行清理函数,执行完之后,线程终止。

所以就有了下面两个函数:
Linux_UNIX编程手册-读书笔记-第三十二章(线程:线程取消)
这里有一个疑问: 这个函数和atexit有啥区别?

通常,线程如在执行一段特殊代码时遭到取消,才需要执行清理动作。如果线程顺利执行完这段代码而未遭取消,那么就不在需要清理。

SUSv3将这两个函数实现为宏,这意味着配对的这两个函数必须属于同一个语法块。
这句话也不太懂

32.6 异步取消

如果设定线程为可异步取消时,可以在任何时点将其取消,取消动作不会拖延到下一个取消点才执行。Linux_UNIX编程手册-读书笔记-第三十二章(线程:线程取消)
BALABALA一堆又说不能用。