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

时间:2010-11-08 16:15:47

标签: c++ multithreading boost

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

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

3 个答案:

答案 0 :(得分:5)

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

除此之外,我的直接反应是,而不是“开启”(你的意思是创造?)线程A每秒24次,你最好用线程A读取缓冲区,将其发送到线程B ,然后睡觉,直到它准备好读取另一个缓冲区。创建和杀死线程并不是非常昂贵的,但是以24(或者,显然是48)的速度执行它会让我感到有点过分。

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

请不要随意杀死线程,除非你完全控制它们的执行(然后只是为线程正常地发出正确的信号)。你永远不知道其他线程是否在你从未听说过的库的某个关键部分,然后你的程序最终会停止在CS上,因为它从未退出或类似的东西。