C++ C++;11是否替换“GetExitCodeThread”以监视线程状态?

C++ C++;11是否替换“GetExitCodeThread”以监视线程状态?,c++,multithreading,c++11,C++,Multithreading,C++11,我正在对一个现有应用程序进行大规模重构和移植,该应用程序使用windows线程执行一些非常惊人(可怕)的操作 现在,有内部逻辑调用GetExitCodeThread(m_threadHandle,&exitCode),然后检查exitCode==是否仍然处于活动状态,以确定所讨论的线程是否仍在执行或已返回,然后使用该线程对一些内部逻辑进行排序 如何检查std::thread是否仍在执行,或者是否已返回/引发异常 我知道std::async,std::promises和std::future。然而

我正在对一个现有应用程序进行大规模重构和移植,该应用程序使用windows线程执行一些非常惊人(可怕)的操作

现在,有内部逻辑调用
GetExitCodeThread(m_threadHandle,&exitCode),然后检查exitCode==是否仍然处于活动状态
,以确定所讨论的线程是否仍在执行或已返回,然后使用该线程对一些内部逻辑进行排序

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


我知道
std::async
std::promises
std::future
。然而,使用这些工具会涉及大量的重构,我觉得我对代码库的了解还不够充分,无法在不破坏一打其他东西的情况下进行如此大规模的更改。

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


因此,在超时值为0的有效线程句柄上调用
WaitForSingleObject()
(在您的情况下,您可以通过
std::thread::native_handle()
)将返回
WAIT_timeout
,表示线程确实仍然处于活动状态。

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

如果不使用特定于平台的函数,就无法真正检查对象是否已完成。这可能是您用例的发展方向。@JoachimPileborg-这就是我所担心的。整个应用程序有点不可思议的庞大和复杂,并且做了一大堆内部同步的事情,我想如果我碰上任何东西,整个事情都会爆炸。我只需要针对两个平台(windows、linux),所以我考虑只针对每个平台做一件特定于平台的事情。是的,我实际上正在从windows->linux进行移植。它使用
GetExitCodeThread(m_threadHandle,&exitCode)
,如果线程处于活动状态,则返回
仍然处于活动状态。不过,这仍然留下了一个linux解决方案。明白了——不幸的是,在linux/POSIX上没有能够复制该功能的现成等价物。你得自己卷东西。如果您使用的是std::thread对象,那么可以将线程函数包装在一个带有条件变量的类中,当包装的函数返回时,可以发出信号。祝你好运是的,这就是我所倾向的方向。这是我第一次真正的C++,所以现在有点压倒一切。这就是我使用的解决方案。