Boost,C ++如何杀死另一个线程打开的线程?

Posted

技术标签:

【中文标题】Boost,C ++如何杀死另一个线程打开的线程?【英文标题】:Boost, C++ how to kill thread opened by another thread? 【发布时间】:2010-11-08 16:15:47 【问题描述】:

所以我有一些主要功能。每秒 24 次,它会打开一个带有函数的 boost 线程 A。该函数接收一个带有数据的缓冲区。它启动一个升压计时器。它打开另一个线程B,其中包含一个向其中发送缓冲区的函数。如果线程 B 以 2 长的方式执行,我需要线程 A 来杀死线程 B。当然,如果线程 B 已及时执行,我不需要杀死它,它应该杀死自己。什么增强功能可以帮助我杀死创建的线程(而不是加入 - 停止/杀死或类似的东西)?

顺便说一句,我不能影响我在线程 B 中执行的函数的速度,这就是为什么我需要能够在需要时杀死它。

【问题讨论】:

【参考方案1】:

没有干净的方法来杀死一个线程,所以如果你需要做这样的事情,你干净的选择是使用一个包含一些取消功能的函数,或者使用一个单独的进程,因为你 可以干净地杀死一个进程。

除此之外,我的直接反应是,与其“打开”(您的意思是创建吗?)线程 A 每秒 24 次,不如线程 A 读取缓冲区,将其发送到线程 B ,然后休眠,直到它准备好读取另一个缓冲区。创建和杀死线程并不是非常昂贵,但以每秒 24(或者,显然是 48)的速度来做这件事让我觉得有点过分了。

【讨论】:

【参考方案2】:

您要查找的术语是“取消”,如pthread_cancel(3)。取消很麻烦,因为取消的线程可能不会执行 C++ 析构函数或在退出时释放锁......但它可能会再次出现;不确定性实际上比确定的否更糟糕

正因为如此,boost 线程不支持取消(例如参见 this older question),但它们支持 interruption,您可以弯曲以适应。中断通过常规 C++ 异常工作,因此它具有可预测的语义。

【讨论】:

【参考方案3】:

请不要随意杀死线程,除非您完全控制它们的执行(然后只需发出适当的信号让线程正常退出)。您永远不知道其他线程是否位于您从未听说过的库的某个关键部分中,然后您的程序最终将停止在该 CS 上,因为它从未退出或类似的情况。

【讨论】:

以上是关于Boost,C ++如何杀死另一个线程打开的线程?的主要内容,如果未能解决你的问题,请参考以下文章

BOOST 如何在一个线程中发送信号并在另一个线程中执行相应的插槽?

C ++如何等待在另一个线程上执行的方法然后主线程完成(VS2010)

如何将 traceId 从 gRPC 的上下文传递到另一个线程/线程池?

将数据从UI线程传递到c#中的另一个线程

如何使用信号调用同一进程中的另一个线程在轮询函数上休眠的进程而不杀死它?

有一个返回 int 的函数,我如何使用 boost 在单独的线程中运行它?