【问题标题】:How can I determine if a Win32 thread has terminated?如何确定 Win32 线程是否已终止?
【发布时间】:2010-09-22 23:56:23
【问题描述】:

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

GetExitCodeThread 的文档警告不要因为这个原因使用它,因为其他原因可能会返回错误代码 STILL_ACTIVE。

感谢您的帮助! :)

【问题讨论】:

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

标签: c++ c multithreading winapi


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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,其中代码和 ExitCode 分别由 DWORD code = WaitForSingleObject(tHwnd, 0)GetExitCodeThread(tHwnd, &ExitCode) 定义。
    • 请注意,上面用于检查result 的代码不正确。从技术上讲,有 3 个可能的返回值:WAIT_OBJECT_0WAIT_TIMEOUTWAIT_FAILED。所以它不能只是“是的,它还活着”。只有得到WAIT_TIMEOUT才可以,否则就是错误。
    猜你喜欢
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多