在我的应用程序中,我只使用10到12个工作线程。我在某个地方看到 当一个线程调用一个等待函数时,它从用户模式进入内核模式。由于进入内核模式需要大约1000个处理器周期,这在具体情况下可能太昂贵,这是有点昂贵的。
但是,正如goths和ScottMcP所建议的那样,我使用WaitForMultipleObjects而不是WaitForSingleObject以下面的方式确保在清理线程使用的任何资源之前进行正常的线程关闭。
CEvent doWork,exitThread; //Auto reset events
CWinThread* MyThread;
UINT MyThreadFunction(LPVOID param);
BOOL CMyDlg::OnInitDialog()
{
//Other initialization code
MyThread=AfxBeginThread(MyThreadFunction, CMyDlg::GetSafeHwnd());
//Any other initialization code
return TRUE;
}
UINT MyThreadFunction(LPVOID param)
{
HANDLE waitEvents[2];
waitEvents[0]=doWork;
waitEvents[1]=exitThread;
while(true)
{
DWORD stat=::WaitForMultipleObjects(2, waitEvents, FALSE, INFINITE);
switch(stat)
{
case WAIT_OBJECT_0 + 0:
// doWork CEvent is signalled; proceed to do some work
break;
case WAIT_OBJECT_0 + 1:
//exitThread is signalled; so exit from this thread handler function
return 0;
case WAIT_FAILED:
// failure may be related to wrong handles passed for lpHandles
break;
case WAIT_TIMEOUT:
// not applicable here because dwMilliseconds parameter is set to INFINITE
break;
}
}
return 0;
}
CMyDlg::OnClose()
{
exitThread.SetEvent();
DWORD Stat=WaitForSingleObject(MyThread->m_hThread, INFINITE);
if(Stat==WAIT_OBJECT_0)
{
//Thread supposed to be Exited
//Cleanup allocated resources here
}
else if(Stat==WAIT_TIMEOUT)
{
//not applicable here
}
else if(Stat==WAIT_FAILED)
{
//Invalid thred handle passed or something else
}
EndDialog(0);
}
请检查我的答案,如果发现任何错误或有任何改进的范围。
我认为你的答案只解释了如何以清洁的方式关闭应用程序。主线程可以确保所有工作线程已成功退出;因此现在是释放所有全球资源并退出的时候了。我以不同的方式使用布尔变量来实现它,但是这并不能确保在取消分配这些线程使用的全局数据之前正确关闭工作线程。虽然它非常清楚如何实现,请给出一些实现这个想法的代码片段?您对我的帖子中的查询有任何建议吗? – Sukhendu