当取消请求排队时,pthread_cancel()将如何响应
How will pthread_cancel() respond when the cancellation request is queued?
这是一个基本问题,但答案似乎让我难以捉摸。无论如何,以下是背景信息:
根据手册页,pthread_cancel()
的返回值如下:
成功后,pthread_cancel()返回0;出现错误时,它返回非零错误数。
根据要取消的线程的取消状态,它可能会立即终止,或者请求可能会排队。在我的情况下,取消将被推迟,并将通过一些清理处理程序运行。在我的主线程中,我想验证返回值。也就是说,一个简单的方法是添加一行,如
assert(pthread_cancel(tID));
据我所知,如果请求成功排队,pthread_cancel()
似乎只是返回0
,而不是线程被取消。换句话说,上面的代码行是非阻塞的吗?我担心的是,如果我误解了手册页,并且我在子线程中有一个特别长的延迟期,我的主线程将被卡住,因为pthread_cancel()
正在阻塞。
pthread_cancel()
永远不会阻塞。它也不会告诉您线程是否已成功取消。
模式延迟:它只设置一个标志(取消请求),相关线程必须主动查询该标志(可能在系统调用中隐式查询),然后线程将协同退出。
异步模式下:线程将在任何时间点被取消(通常是立即取消)。这只在纯CPU绑定循环中是安全的,不调用任何系统或库函数,甚至不直接或间接分配内存。请注意,如果线程使用互斥或其他相关线程原语与其他线程同步,这也是不安全的,因为取消线程将使所有互斥处于未定义状态。
简而言之:异步取消通常是不安全的,在设计上是不干净的,通常应该避免。只有极少数的用例可以以干净的方式使用它(例如,100%CPU绑定的代码仅通过获取/释放语义(无锁)与其他线程通信)。
来自我的手册页:
目标线程中的取消处理相对于从pthread_cancel()返回的调用线程异步运行。
所以,是的,你的断言不会阻塞。
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- C++ 信号和插槽不工作:插槽不响应事件
- NodeJs 服务器充斥着 UDP 广播,不发送响应
- C++关于ENUM的问题。我得到的响应比枚举列表大
- 应用程序在打开的简历中捕获视频后没有响应
- 使用 cpprest (Casablanca) 返回 PDF 响应
- 为什么当通过 TCP 发送的消息速率增加时,请求-响应消息对的延迟会降低?
- 如何使用从处理程序调度的最终回调将响应异步返回给调用方on_read?
- 获取加密的正文响应WinHttp HTTPS
- QtConcurrent - 在发布到 UI 线程的数千个结果中保持 GUI 响应
- 同步读取多个 TCP 响应
- HTTP 响应格式不正确?
- 如何使用软化工具包从 OPC UA 服务器异步读取操作回调中的数据值响应中获取 NodeId 详细信息
- HTTP帖子,无需等待响应
- 问题导致程序停止响应,并且姓氏未正确打印
- AT 命令响应解析器
- 将静态 IP 分配给我的 ESP32 服务器后不再响应
- 用于C++的 TCP/IP 解析器和响应器
- 我会导致太多内存泄漏,以至于我的计算机无响应吗?
- 如何从wxWebView获取响应