关于线程退出的问题
线程退出后死锁
我先把相关代码帖出来,问题描述在后面
void CMulThreadDialog::OnOK()
{
......
m_pCmdThread = AfxBeginThread(CmdTdFunction, (LPVOID)this);
}
UINT __cdecl CMulThreadDialog::CmdTdFunction( LPVOID pParam )
{
CMulThreadDialog * pDlg = (CMulThreadDialog *)pParam;
pDlg->DoCommand();
PostMessage(WM_COMMAND, UM_ENDDIALOG, 0);
WriteLog(1000,1000,_T("the hthread: 0x%x run end"), pDlg->m_pCmdThread->m_hThread);
return 0;
}
void CMulThreadDialog::OnEndDialog()
{
MSG msg;
while(PeekMessage(&msg, this->m_hWnd,UM_SETPROGPOS,UM_SETPROGPOS,PM_REMOVE ));
while(PeekMessage(&msg, this->m_hWnd,UM_ENABLEUI,UM_ENABLEUI,PM_REMOVE ));
WriteLog(1000, 1000, _T("In OnEndDialog ...\tm_pCmdThread: 0x%x, HTHREAD: 0x%x"), m_pCmdThread, m_pCmdThread->m_hThread);
if (m_pCmdThread && m_pCmdThread->m_hThread)
{
WaitForSingleObject(m_pCmdThread->m_hThread, INFINITE); //1,偶尔会死在此处
}
VisLogLine(1000, 1000, _T("OnEndDialog End"));
CDialog::OnOK(); //2,偶尔会死在此处
}
问题是为什么我的线程函数已经走到return 0;了,但是我在OnEndDialog函数里输出的log中可以看到m_pCmdThread->m_hThread这个值偶尔是个有效的线程句柄值. 当这个值是个无效值时也就是说线程return后被autodelete掉了,所以handle变为无效(0xcdcdcdcd)程序可以正常退出,但有时这个值仍有效, 这时return 0也走了,线程有时会死在1处,偶尔还会死在CDialog::OnOK();里,很迷惑..