优雅地停止std::线程
Gracefully stopping an std::thread?
我有一个工作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线程文档
- 即发即弃 std::线程对象清理自身
- std::线程导致程序中止
- 在std::线程中使用已分配的结构数据
- 使用-static libstdc++时std::线程弱,因此在运行时会导致崩溃
- std::线程与 pthread_setschedparam 与 C++ 11.
- 运行 std::线程不在构造函数中
- C++ std::线程调用方法,从对象原因到调用此类的析构函数
- 编译问题 C++ 同时,尝试通过调用另一个对象中的成员函数来创建 std:: 线程
- 错误:静态断言失败:std ::线程参数必须在转换为rvalues后不可行
- C STD ::线程中的种族状况或内存损坏
- 在 Valgrind 输出中仍然可以访问 std 线程向量的块
- 将类Cotaining std ::线程添加到向量
- 如何使用mingw编译C STD ::线程代码
- 从其他std ::线程更新QT GUI
- STD ::线程不会退出
- 处理 std::线程包装器类的立即销毁
- C++ std 线程并列出分段错误(核心转储)
- 杀死后的STD ::线程如何处理
- 干净取消在输入/输出调用中被阻止的 std::线程
- std ::线程最大并发线程