我正在研究一个现有应用程序的大型重构和端口,它使用Windows线程执行一些相当壮观(非常糟糕)的事情。
现在,有一个内部逻辑在一组正在运行的线程上调用GetExitCodeThread(m_threadHandle, &exitCode);
,然后检查是否exitCode == STILL_ACTIVE
以确定相关线程是否仍在执行,或者是否已返回,然后用它来排序一些内部逻辑。
如何检查std::thread
是否仍在执行,或者是否已返回/抛出异常?
我了解std::async
,std::promises
和std::future
。然而,使用那些将涉及相当多的重构,并且我不会觉得我已经足够熟悉代码库,可以在不打破其他任何事情的情况下进行大规模的更改。
答案 0 :(得分:1)
在Windows上,线程对象在退出时会发出信号。
因此,在有效的线程句柄上调用WaitForSingleObject()
(在你的情况下,你通过std::thread::native_handle()
获得这个),超时值为0将返回WAIT_TIMEOUT
,表明线程确实仍然活跃。
答案 1 :(得分:0)
如果你打算用std :: thread替换对Windows线程API的直接调用,那么一个好的选择就是编写一个派生自std :: thread的类并改为使用它。在构造函数中,您将传递的仿函数封装在自己的仿函数中,该仿函数将线程安全标志“running”设置为true,调用另一个仿函数,并将标志设置为false。然后你只需要一个方法is_running()来返回这个标志的内容。