Lazy loaded image
embedded
pthread_cancel什么时候杀死?
Words 614Read Time 2 min
2025-8-30
2025-8-30
type
status
date
slug
summary
tags
category
icon
password
这个点是 POSIX 线程取消机制 里最容易让人糊涂的地方 👍,我帮你拆开:

1. pthread_cancel 的作用

  • 当线程 A 调用:
    • 它的意思是:给线程 B 发送一个“取消请求”
  • 注意:只是请求,并不是立刻杀死。

2. 线程 B 什么时候会响应取消?

线程 B 并不是随时都能立刻被杀的,它必须满足两个条件:
  1. 线程取消状态开启(默认是开启的):
    1. 如果 B 自己设置成 DISABLE,那它完全不响应取消请求。
  1. 到达取消点 (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 看起来就“没用”。
上一篇
嵌入式学习路线及推荐资源
下一篇
今天成功部署NotionNext个人博客

Comments
Loading...