PTHREAD_CANCEL_ASYNCHRONOUS
和PTHREAD_CANCEL_DEFERRED
(由pthread_setcanceltype(3)
设置),确定pthread_cancel(3)
何时生效。据我所知,POSIX手册并没有对此多加说明,但Linux手册对PTHREAD_CANCEL_ASYNCHRONOUS
的说明如下:引用:
线程可以在任何时候被取消。(通常情况下,在接收到取消请求后立即被取消,但系统不能保证这一点。)
我很好奇“系统不能保证这一点”的意思。我可以很容易地想象这种情况发生在多核/多CPU系统中(在上下文切换之前)。但是单核系统呢?1. 当启用取消(
pthread_setcancelstate(3)
)并将取消类型设置为PTHREAD_CANCEL_ASYNCHRONOUS
时,我们是否可能有一个线程在请求取消时不会立即被取消?
2. 如果是,什么条件下会发生这种情况?我主要关心Linux(LinuxThreads / NPTL),但也更普遍地关注符合POSIX标准的方式来看待这个取消业务。
更新/澄清: 实际上,这里真正的实际关注点是在调用
pthread_cancel()
后立即销毁的资源的使用,其中目标线程启用了取消并将其设置为类型PTHREAD_CANCEL_ASYNCHRONOUS
!!!因此,关键问题是:在上下文切换后,即使只有很短的时间,被取消的线程在这种情况下是否仍可能继续正常运行?感谢Damon的答案,问题被减少到与下一个上下文切换相关的信号传递和处理。
更新-2: 我回答了自己的问题,指出这是错误的问题,并且应该从根本上不同的概念层面解决底层程序设计。我希望这个“错误”的问题对于其他想知道异步取消奥秘的人有所帮助。
pthread_cancel()
调用之后上下文切换也不会立即发生。更加具体和实际的答案是:当信号被接收并且信号处理程序相对于下一个上下文切换运行时(在无法实现真正并发的单核架构中)? - FooF