优雅地停止std::线程

Gracefully stopping an std::thread?

本文关键字:std 线程      更新时间:2023-10-16

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

。。好吧,这取决于情况。线程在做什么?它是否阻止任何东西,I/O、sleep或其他API?

如果它只是CPU一直在循环,那么它停止的确切时间无关紧要,它停止并退出,那么只需使用布尔值。在这种情况下,锁定"stopAndExit"布尔值毫无意义。

如果工作线程在一个循环中没有将其读取为true,而由于缺乏原子性,它可能应该读取,那么它将在下一次获得它。为什么不必执行锁/API调用?与简单的"if(stop)exit;"相比,用户为获取/释放同步对象而进行的内核级调用将花费很长时间,在本可以用于计算的每个循环上浪费时间,或者在CPU绑定线程中做任何事情。

它是跨平台

谨致问候,Martin

您可以拥有一个在主线程和工作线程之间共享的std::互斥体。

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

std::mutex及其亲属是核心机制。std::lock_guard和unique_lock在此基础上构建,std::condition_variable非常适合此目的。

正如您提到的boost,您可以使用boost::线程。

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

您可以在此处查看文档:Boost线程文档