当取消请求排队时,pthread_cancel() 将如何响应?

How will pthread_cancel() respond when the cancellation request is queued?

这是一个基本问题,但我似乎找不到答案。无论如何,这里是背景信息:

根据手册页,pthread_cancel() 的 return 值如下:

On success, pthread_cancel() returns 0; on error, it returns a nonzero error number.

根据要取消的线程的取消状态,它可能会立即终止,或者请求可能会排队。在我的例子中,取消将被推迟,并将 运行 通过一些清理处理程序。在我的主线程中,我想验证 return 值。也就是说,一个简单的方法是添加一行

assert(pthread_cancel(tID));

据我所知,似乎 pthread_cancel() 只是 returns 0 如果请求已成功排队,而不是线程被取消。也就是说,上面这行代码会不会是非阻塞的?我担心的是,如果我误解了手册页,并且我在子线程中有特别长的延迟期,我的主线程将卡在断言上,因为 pthread_cancel() 正在阻塞。

来自我的手册页:

The cancellation processing in the target thread runs asynchronously with respect to the calling thread returning from pthread_cancel().

所以是的,你的断言不会阻塞。

pthread_cancel() 永远不会阻塞。它也不会告诉您线程是否已成功取消。

在延迟模式下:它只是设置一个标志(取消请求),相关线程必须主动查询(可能隐式地在系统调用中),然后线程将退出合作.

在异步模式下:线程会在任何时间点被取消(通常是立即)。这仅在纯 CPU 绑定循环中是安全的,不调用任何系统或库函数,甚至不直接或间接分配内存。请注意,如果线程正在使用互斥锁或其他相关线程原语与其他线程同步,这也不安全,因为取消线程将使所有互斥锁处于未定义状态。

简而言之:异步取消通常是不安全的,设计不干净,通常应该避免。只有极少数用例可以以干净的方式使用它(例如 100% CPU 绑定代码仅通过 acquire/release 语义(无锁)与其他线程通信。