type
status
date
slug
summary
tags
category
icon
password
这个点是 POSIX 线程取消机制 里最容易让人糊涂的地方 👍,我帮你拆开:
1. pthread_cancel
的作用
- 当线程 A 调用:
它的意思是:给线程 B 发送一个“取消请求”。
- 注意:只是请求,并不是立刻杀死。
2. 线程 B 什么时候会响应取消?
线程 B 并不是随时都能立刻被杀的,它必须满足两个条件:
- 线程取消状态开启(默认是开启的):
如果 B 自己设置成
DISABLE
,那它完全不响应取消请求。- 到达取消点 (cancellation point):
- 线程只有在运行到某些特定函数(称为 取消点)的时候,才会检查有没有取消请求,如果有就会退出。
- 这些函数大多是 可能阻塞的系统调用,比如:
read
,write
,accept
,select
,pthread_join
,sleep
…- 所以,线程 B 如果一直在用户态里跑计算(比如死循环做加法),它就永远不去检查取消点 ⇒ 就“死不了”。
3. 你说的这句话的含义
“在线程B中进行一次系统调用(从用户区切换到内核区),否则线程B可以一直运行。”
意思就是:
- 如果线程 B 没有进入取消点(通常是系统调用),它不会感知到有取消请求。
- 它就能一直在用户态跑,不会被
pthread_cancel
杀死。
- 一旦进入了取消点(例如调用
read
去读 socket),线程 B 会检查: - 如果有取消请求,就会立刻退出。
4. 补充:强制杀死?
POSIX 的设计理念是:
- 取消不是强杀,而是“协作退出”。
- 真正的“强制杀死线程”(像
kill -9
杀进程那样)在 pthread 里没有标准接口,因为它会带来锁不释放、资源没清理的严重问题。
✅ 总结:
pthread_cancel
只是发取消请求。
- 线程 B 必须 到达取消点(常见是系统调用/阻塞函数),才会真正退出。
- 如果 B 一直在用户态里死循环,没有取消点 → 它就不会响应,
pthread_cancel
看起来就“没用”。
- Author:Blinky
- URL:http://preview.tangly1024.com/article/25f1c0db-37a0-8079-8390-caeae3a6c4be
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!