如何确定Win32线程是否已终止?

16

如何确定Win32线程是否已终止?

GetExitCodeThread文档警告不要使用它来判断线程是否终止,因为错误码STILL_ACTIVE可能会因其他原因而返回。

谢谢帮助!:)


如果线程是您自己的,您可以确保所有线程返回0。因此,这个问题永远不会出现。我认为ExitCodeThread()是更好的解决方案,比起已接受的答案,因为MSDN中提到的“其他原因”只是您从线程例程中返回了STILL_ACTIVE退出代码。所以,不要这样做就可以了。 - Elmue
2个回答

41

MSDN提到,“当线程终止时,线程对象会达到一个已发信号状态,满足任何正在等待该对象的线程”。

因此,您可以通过检查线程句柄的状态(已发信号或未发信号)来检查线程是否已终止:

DWORD result = WaitForSingleObject( hThread, 0);

if (result == WAIT_OBJECT_0) {
    // the thread handle is signaled - the thread has terminated
}
else {
    // the thread handle is not signaled - the thread is still alive
}

我同意这个解决方案。然而,我之前使用的是 code == WAIT_TIMEOUT && ExitCode == STILL_ACTIVE,其中 codeExitCode 是由 DWORD code = WaitForSingleObject(tHwnd, 0)GetExitCodeThread(tHwnd, &ExitCode) 定义的。 - Chef Pharaoh
9
请注意,上面用于检查result的代码是不正确的。从技术上讲,有三种可能的返回值:WAIT_OBJECT_0WAIT_TIMEOUTWAIT_FAILED。因此,它不能只是简单地用else语句判断“是的,它还活着”。只有当你得到WAIT_TIMEOUT时才能这样做,否则就是一个错误。 - c00000fd

7

你链接的文档警告不要使用STILL_ACTIVE作为返回代码,因为它无法与用于指示活动线程的返回值区分开来。 所以不要将其用作返回值,就不会有这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接