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