C ++ 11替代`GetExitCodeThread`来监视线程状态?

时间:2015-03-26 21:58:10

标签: c++ multithreading c++11

我正在研究一个现有应用程序的大型重构和端口,它使用Windows线程执行一些相当壮观(非常糟糕)的事情。

现在,有一个内部逻辑在一组正在运行的线程上调用GetExitCodeThread(m_threadHandle, &exitCode);,然后检查是否exitCode == STILL_ACTIVE以确定相关线程是否仍在执行,或者是否已返回,然后用它来排序一些内部逻辑。

如何检查std::thread是否仍在执行,或者是否已返回/抛出异常?

我了解std::asyncstd::promisesstd::future。然而,使用那些将涉及相当多的重构,并且我不会觉得我已经足够熟悉代码库,可以在不打破其他任何事情的情况下进行大规模的更改。

2 个答案:

答案 0 :(得分:1)

在Windows上,线程对象在退出时会发出信号。

因此,在有效的线程句柄上调用WaitForSingleObject()(在你的情况下,你通过std::thread::native_handle()获得这个),超时值为0将返回WAIT_TIMEOUT,表明线程确实仍然活跃。

答案 1 :(得分:0)

如果你打算用std :: thread替换对Windows线程API的直接调用,那么一个好的选择就是编写一个派生自std :: thread的类并改为使用它。在构造函数中,您将传递的仿函数封装在自己的仿函数中,该仿函数将线程安全标志“running”设置为true,调用另一个仿函数,并将标志设置为false。然后你只需要一个方法is_running()来返回这个标志的内容。