c++ - 如何处理请求时可能不会终止的线程?

标签 c++ multithreading c++11 stl

假设我的类在其构造函数中运行一个线程,以进行后台处理,并希望在析构函数中终止该线程。

我们通常会设置一些标志,以便主线程知道它应该退出,然后调用 thread::join。但是,如果线程正忙于执行一些长时间的操作 - 甚至卡住(假设它被阻塞等待某事) - join永远返回怎么办?

没有办法将超时参数传递给 join 并且 std::thread 上没有 terminate 方法我可以看到(http://en.cppreference.com/w/cpp/thread/thread )

我知道在一个设计良好的程序中不应该允许这种情况发生但是...

最佳答案

没有标准工具可以强制终止线程。选项是:

  • detach让它永远自行运行(直到程序退出)。
  • 使用thread::native_handle()成员获取底层句柄。然后使用您的平台库(pthread、WinAPI 或其他任何东西)来终止线程。

至于如何检测这种情况,可以用,比如两个atomic<bool>变量,stopfinished .设置第一个,您将指示线程停止。线程将定期检查此变量,如果已设置,将停止其事件,然后设置 finished并退出。您的主程序将等待一段时间(可能在循环中)finished。设置,如果是,请调用 join .如果没有,(意味着线程没有响应),请使用上述两种解决方案之一。

关于c++ - 如何处理请求时可能不会终止的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33548191/

相关文章:

c++ - 如何通过映射从派生类实例化对象

c++ - 用零初始化类成员

c++ - 有没有办法将 void 作为参数传递?

multithreading - 哪些阻止Vulkan功能?

c++ - 在 C++0x 中虚拟方法不是 "delete"吗?

c++ - g++ 在 freebsd 上包含路径

c++ - 在 Ubuntu 上通过 USB 读取 Zebra 打印机状态

c++ - MFC - UpdateData(False) + 线程 + 调试断言失败

java - 检测当前线程是否为 ExecutorService 线程

c++ - 在生命周期有限的多个模块之间共享 std::function