优雅地停止std :: thread?

时间:2011-06-02 12:10:29

标签: c++ multithreading

我有一个工人std::thread,我希望它的主循环检查是否有其他线程告诉它停止循环并退出。
什么是一个很好的跨平台方式来做到这一点? boost是否为它提供了一些事件对象? 仅使用bool认为是线程安全的吗?

4 个答案:

答案 0 :(得分:7)

..这取决于它。线程在做什么?它是否会阻止任何内容,I / O,sleep或其他API?

如果它只是CPU循环它与停止和退出的确切时间无关紧要,那么只需使用布尔值即可。在这种情况下,锁定'stopAndExit'布尔值是没有意义的。

如果工作线程在一个循环中没有将它读为真,那么也许它应该是,因为一些缺乏原子性,它将在下一轮获得它。为什么在不需要时执行锁定/ API调用?与简单的“if(停止)退出;”相比,用户获取/释放同步对象的内核级调用将花费很长时间,在每个可用于计算的循环上浪费时间,或者在CPU中执行的任何操作 - 绑定线程。

它是跨平台的

此致 马丁

答案 1 :(得分:2)

你可能拥有的是在主要和工作线程之间共享的std :: mutex。

您的工作线程可以在开始任何工作之前获取std :: mutex :: try_lock并间歇性地释放它。当主线程希望您的工作线程关闭时,主线程可以锁定此互斥锁。您的工作线程可以使用try_lock检测到这一点并退出

答案 2 :(得分:0)

std :: mutex和它的亲戚是核心机制。 std :: lock_guard和unique_lock构建于此,并且std :: condition_variable对此有用。

答案 3 :(得分:0)

正如你提到的那样,你可以使用boost :: thread。

在你的情况下,在启动一个线程后,你可以使用interrupt()方法来中断它。接收器线程可以使用boost :: this_thread :: interruption_point()方法检查中断请求。如果有中断请求,这将导致线程退出,否则,它将忽略它。

您可以在此处查看文档: Boost Thread Documentation