完善线程退出机制
- 加入线程退出条件变量m_bQuitThread, 初始化为false.
- 在线程内的循环中加入退出变量检测,当m_bQuitThread为true时,主动结束线程
- 在程序退出时,首先设置m_bQuitThread为true,而后使用WaitForSingleObject等待线程完全退出
代码
CDialogList::CDialogList(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_DIALOG_LIST, pParent)
{
m_bQuitThread = false;
}
// 启动线程
m_refreshLatencyThread = AfxBeginThread((AFX_THREADPROC)RefreshThread, this);
// 退出逻辑
void CDialogrList::EndThread() {
m_bQuitThread = true;
WaitForSingleObject(m_refreshLatencyThread->m_hThread, INFINITE);
TRACE(TEXT("线程已经退出"));
}
这么做其实是有问题的。假设一种情况,EndThread()中,m_bQuitThread = true和WaitForSingleObject之间,线程完成了退出,会出现什么情况?时序如下:
- EndThread()执行m_bQuitThread = true;
- m_refreshLatencyThread检测到退出变量完成工作return 0
- EndThread()执行WaitForSingleObject
会卡死在这里有没有?
改进
void CDialogrList::EndThread() {
DWORD dwExitCode = 0;
m_bQuitThread = true;
while (::GetExitCodeThread(m_refreshLatencyThread->m_hThread, &dwExitCode) == STILL_ACTIVE) {
WaitForSingleObject(m_refreshLatencyThread->m_hThread, 300);
}
TRACE(TEXT("线程已经退出"));
}
很久没有过来了,今天过来学习学习!