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

时间:2015-11-05 15:12:36

标签: c++ multithreading c++11 stl

让我们说我的类在其构造函数中运行一个线程,进行后台处理,并希望在析构函数中杀死该线程。

我们通常会设置一些标志,以便主线知道它应该退出,然后调用thread::join。但是如果线程正在忙着进行一些长时间的操作 - 甚至卡住(让我们说它等待某些东西等等)会怎么样?join 永远不会返回?< / p>

我无法在join terminate上将超时参数传递给std::thread并且没有setInterval(function () { position.x = $('#crystalship_exhaust').offset().left; position.y = $('#crystalship_exhaust').offset().top; }, 100); 方法,我可以看到(http://en.cppreference.com/w/cpp/thread/thread

我知道在一个精心设计的程序中,这不应该被允许发生但是......

1 个答案:

答案 0 :(得分:1)

没有强制杀死线程的标准工具。选项包括:

  • detach让它永远运行(直到程序退出)。
  • 使用thread::native_handle()成员获取基础句柄。然后使用你的平台库(pthread,或WinAPI或其他任何东西)来杀死线程。

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