假设我的类在其构造函数中运行一个线程,以进行后台处理,并希望在析构函数中终止该线程。
我们通常会设置一些标志,以便主线程知道它应该退出,然后调用 thread::join
。但是,如果线程正忙于执行一些长时间的操作 - 甚至卡住(假设它被阻塞等待某事) - join
将永远返回怎么办?
没有办法将超时参数传递给 join
并且 std::thread
上没有 terminate
方法我可以看到(http://en.cppreference.com/w/cpp/thread/thread )
我知道在一个设计良好的程序中不应该允许这种情况发生但是...
最佳答案
没有标准工具可以强制终止线程。选项是:
-
detach
让它永远自行运行(直到程序退出)。 - 使用
thread::native_handle()
成员获取底层句柄。然后使用您的平台库(pthread、WinAPI 或其他任何东西)来终止线程。
至于如何检测这种情况,可以用,比如两个atomic<bool>
变量,stop
和 finished
.设置第一个,您将指示线程停止。线程将定期检查此变量,如果已设置,将停止其事件,然后设置 finished
并退出。您的主程序将等待一段时间(可能在循环中)finished
。设置,如果是,请调用 join
.如果没有,(意味着线程没有响应),请使用上述两种解决方案之一。
关于c++ - 如何处理请求时可能不会终止的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33548191/