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

标签 c++ c multithreading pthreads

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

根据手册页,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/

相关文章:

c - 这个按位表达式如何帮助找到两个整数之间的最小值和最大值?

c - 动态数组的大小不正确

c# - 通过线程将表单显示为另一个表单上的对话框

c++ - 在 Ubuntu 上使用 OpenGL 显示闪烁

c++ - 为 opengl 纹理加载图像时,stb_image 不会垂直翻转

android - android上的Qt,减少二进制大小

c++ - Qt C++ 限制应用程序可用的系统资源

c - ptrace 选项根本不起作用

java - Conway 生命游戏的多线程 Java 程序 - 边界单元的竞争

.net - ServerGC 应用程序中的 GC 线程数非常高