POSIX 为线程取消类型指定了两种类型:PTHREAD_CANCEL_ASYNCHRONOUS
和PTHREAD_CANCEL_DEFERRED
(由 设置pthread_setcanceltype(3)
)确定何时pthread_cancel(3)
应该生效。根据我的阅读,POSIX 手册页对这些内容没有太多说明,但 Linux 手册页对以下内容进行了说明PTHREAD_CANCEL_ASYNCHRONOUS
:
线程可以随时取消。(通常情况下,收到取消请求后会立即取消,但系统不保证这一点。)
我很好奇系统的含义并不能保证这一点。我可以很容易地想象这发生在多核/多 CPU 系统中(在上下文切换之前)。但是单核系统呢:
- 当请求取消并启用取消(
pthread_setcancelstate(3)
)并将取消类型设置为时,我们是否可以不立即取消线程PTHREAD_CANCEL_ASYNCHRONOUS
? - 如果是,在什么条件下会发生这种情况?
我主要对 Linux (LinuxThreads / NPTL) 感到好奇,但也更普遍地对符合 POSIX 标准的查看此取消业务的方式感到好奇。
更新/澄清:这里真正的实际问题是在调用pthread_cancel()
目标线程启用取消并设置为类型后立即销毁的资源的使用PTHREAD_CANCEL_ASYNCHRONOUS
!所以关键是:在这种情况下,被取消的线程在上下文切换后继续正常运行的可能性很小(即使是很短的时间)?
感谢 Damon 的回答,减少了与下一个上下文切换相关的信号传递和处理问题。
Update-2:我回答了我自己的问题,指出这是一个不好的问题,底层程序设计应该在根本不同的概念级别上解决。我希望这个“错误”的问题对其他想了解异步取消奥秘的人有用。