【发布时间】:2014-12-18 19:00:21
【问题描述】:
我有一个多线程代码,其重置线程定义为:
bool CTestShellDlg::ResetThreads()
{
//if Main worker thread already finished, Just Reset
if (CheckMainThreadFinished())
{
//reset
}
else
if(KillThreads()) //Go ahead and reset if killing is finished.
{
//reset
}
else
return false; //killing already in progress. gotta wait!
}
而KillThreads()定义为:
bool CTestShellDlg::KillThreads()
{
//if killing not already in progress
if (!CheckKillEvent())
{
//Signall the killing event
SetEvent(h_KillEvent);
if (WaitMainThreadFinished())
{
//call some deletes
//Reset the kill event back to non-signalled to indicate it's no longer in progress
ResetEvent(h_KillEvent);
return true; //Killing successful
}
else IERROR
}
else
return false; //Killing already in progress
}
与
bool WaitMainThreadFinished(){WaitForSingleObject(m_hDoIt_Thread, INFINITE);...}
bool CheckMainThreadFinished(){WaitForSingleObject(m_hDoIt_Thread, 0);...}
现在,我可以很好地调用 KillThreads()。在这个过程中,我 WaitForSingleObject(m_hDoIt_Thread, INFINITE) 所以我知道到最后,它肯定是有信号的。现在,如果我尝试调用 ResetThreads(),我在 CheckMainThreadFinished() 中的 WaitForSingleObject(m_hDoIt_Thread, 0) 给了我 WAIT_FAILED,而在我的理解中它应该是 WAIT_OBJECT_0。什么可能导致这种情况? 有什么有趣的。是不是如果我连续进行两次 ResetThreads() 调用,我就不会从 CheckMainThreadFinished() 获得所述返回值。
【问题讨论】:
标签: multithreading mfc thread-safety wait