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

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

本文关键字:何响应 响应 cancel 请求 取消 排队 pthread      更新时间:2023-10-16

这是一个基本问题,但答案似乎让我难以捉摸。无论如何,以下是背景信息:

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

成功后,pthread_cancel()返回0;出现错误时,它返回非零错误数。

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

assert(pthread_cancel(tID));

据我所知,如果请求成功排队,pthread_cancel()似乎只是返回0,而不是线程被取消。换句话说,上面的代码行是非阻塞的吗?我担心的是,如果我误解了手册页,并且我在子线程中有一个特别长的延迟期,我的主线程将被卡住,因为pthread_cancel()正在阻塞。

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

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

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

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

来自我的手册页:

目标线程中的取消处理相对于从pthread_cancel()返回的调用线程异步运行。

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