VC++线程安全退出

楚天乐 2816 1 条

完善线程退出机制

  1. 加入线程退出条件变量m_bQuitThread, 初始化为false.
  2. 在线程内的循环中加入退出变量检测,当m_bQuitThread为true时,主动结束线程
  3. 在程序退出时,首先设置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之间,线程完成了退出,会出现什么情况?时序如下:

  1. EndThread()执行m_bQuitThread = true;
  2. m_refreshLatencyThread检测到退出变量完成工作return 0
  3. 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("线程已经退出"));
}

打赏

微信打赏

支付宝打赏



与本文相关的文章

网友最新评论(1)

很久没有过来了,今天过来学习学习!

July 5th, 2022
发表我的评论
昵称 (必填)
邮箱 (必填)
网址
执行时间: 74.014186859131 毫秒