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) 这个方法可靠吗?有其他方法可以回避吗?
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) 这个方法可靠吗?有其他方法可以回避吗?
如果无效,会返回错误。参见《win32核心编程》。
呃,在调用CloseHandle关闭这个HANDLE之前调用GetHandleInformation是不会返回失败的,关闭了也有可能不返回失败,所以还是WaitForSingleObject比较靠谱