multi-thread 处理中,我经常使用 GetThreadExitCode 来判断 thread 是否已退出,挺好用的。但 MS 最近出了 OEM Ready Test,对于 GetThreadExitCode API 调度会测出返回 值 FAIL !!!其实这是我预期的,thread 结束后,其 m_hHandle 就无效了,传入 GetThreadExitCode 当然导致 API 返回错误。所以开始考虑 HANDLE 的有效性检查,代码如下:
BOOL IsTerminate(CWinThread * pThread)
{
if (pThread == NULL) return TRUE;

DWORD res = 0; if (SUCCEEDED(pThread->m_hThread))
{
GetExitCodeThread(pThread->m_hThread,&res);

if (res == STILL_ACTIVE) 
return FALSE;
} return TRUE;
}那如何判断 HANDLE 有效,SUCCEEDED(pThread->m_hThread) 这个方法可靠吗?有其他方法可以回避吗?

解决方案 »

  1.   

    用GetHandleInformation函数,如果返回失败,且错误码为6,则说明HANDLE无效。但HANDLE只是一个值,一个HANDLE被关闭后,系统再打开其它对象时很可能会分配相同的值,所以判断HANDLE是否有效是不可靠的,最好是由调用GetExitCodeThread的线程来关闭句柄。
      

  2.   

    WaitForSingleObject...等待线程结束
      

  3.   

    waitforsingleobject(hthread, 0);
    如果无效,会返回错误。参见《win32核心编程》。 
      

  4.   


    呃,在调用CloseHandle关闭这个HANDLE之前调用GetHandleInformation是不会返回失败的,关闭了也有可能不返回失败,所以还是WaitForSingleObject比较靠谱
      

  5.   

    handle是否有效就和指针是否有效类似,除了null和-1,基本上其它的信息都是无法判断的还是应该在程序里面保证对一个线程句柄,通过CloseHandle以及WaitForSingleObject等待线程结束,GetThreadExitCode确认是否退出
      

  6.   

    我这边用 OEM Test Ready 测试,任何API的 Fail 都会被计入 测试Fail。我试试大家的方法。
      

  7.   

    做异常TRY{}CATCH{}处理判断下试试
      

  8.   

    OK,测试完毕。使用策略回避,这样比较靠谱:设置 mutex 量,在 initinstance 中 ++ ,exitinstance 中 -- ,主线程等所有计数归零。这样什么测试都不怕了。