这是一个基本问题,但我似乎找不到答案。无论如何,这里是背景信息:
根据手册页,pthread_cancel()
的返回值如下:
On success, pthread_cancel() returns 0; on error, it returns a nonzero error number.
根据要取消的线程的取消状态,它可能会立即终止,也可能会将请求放入队列中。在我的例子中,取消将被推迟,并将通过一些清理处理程序运行。在我的主线程中,我想验证返回值。也就是说,一个简单的方法是添加一行,例如
assert(pthread_cancel(tID));
据我所知,如果请求成功排队,似乎 pthread_cancel()
只是返回 0
,如果线程被取消则不会。也就是说,上面这行代码会不会是非阻塞的?我担心的是,如果我误解了手册页,并且我在子线程中有特别长的延迟期,我的主线程将卡在断言上,因为 pthread_cancel()
正在阻塞。
最佳答案
pthread_cancel()
永远不会阻塞。它也不会告诉您线程是否已成功取消。
在延迟模式下:它只是设置一个标志(取消请求),相关线程必须主动查询(可能隐含在系统调用中),然后线程将合作退出。 p>
在异步模式下:线程会在任何时间点被取消(通常是立即)。这仅在纯 CPU 绑定(bind)循环中是安全的,不调用任何系统或库函数,甚至不直接或间接分配内存。请注意,如果线程正在使用互斥锁或其他相关线程原语与其他线程同步,这也不安全,因为取消线程将使所有互斥锁处于未定义状态。
简而言之:异步取消通常是不安全的,设计不干净,通常应该避免。只有极少数用例可以以干净的方式使用它(例如,100% CPU 绑定(bind)代码仅通过获取/释放语义(无锁)与其他线程通信)。
关于c++ - 当取消请求排队时,pthread_cancel() 将如何响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34343361/