2 ylj135cool ylj135cool 于 2015.07.05 21:42 提问

C++中多线程使用临界区域进行互斥,造成死锁,百思不得其解求指点为啥会死锁

C++中多线程使用临界区域进行互斥,造成死锁,百思不得其解求指点为啥会死锁

 // 在主界面中显示提示信息
void CIOCPModel::_ShowMessage(const int column,const CString szFormat,...)
{
    // 根据传入的参数格式化字符串
    CString   strMessage;
    va_list   arglist;

    // 处理变长参数
    va_start(arglist, szFormat);
    strMessage.FormatV(szFormat,arglist);
    va_end(arglist);

    EnterCriticalSection(&m_csTest);
    // 在主界面中显示
    CAA_5Axis_SingleDlg* pMain = (CAA_5Axis_SingleDlg*)m_pMain;
    if( m_pMain!=NULL )
    {
        //pMain->ShowMsg(strMessage);
        pMain->AddInformation(strMessage,column);
        TRACE( strMessage+_T("\n") );
    }   
    LeaveCriticalSection(&m_csTest);
}

上面的函数,在主线程和由主线程启动的多个子线程中都会被调用,单步跟踪的时候跟着跟着就死锁卡死了,百思不得其解,我有退出临界区啊,为啥还会死锁呢?
求大神解答···
PS:AddInformation(strMessage,column);是在主界面的ListControl中插入一项数据而已;

3个回答

devmiao
devmiao   Ds   Rxr 2015.07.05 22:43

更新界面的操作应该发消息让主线程自己去做。因为它们都是线程不安全的。

dasdingo
dasdingo   2015.07.05 22:30

CRITICAL_SECTION变量初始化了没

oyljerry
oyljerry   Ds   Rxr 2015.07.05 23:01

进入临界区以后,你直接操作UI,可能AddInformation在操作界面的时候,mfc实现会有一些同步阻塞操作。这样可能会导致死锁。你应该用你更新界面没必要加锁。直接用PostMessage到主线程来更新界面。这是一个异步消息队列。这样主线程来一个个抽取消息更新界面

oyljerry
oyljerry 回复ylj135cool: MFC函数尤其UI相关的,不是线程安全的,所以会容易造成死锁,你应该用我的消息队列的方式,所有UI交给主线程来处理
2 年多之前 回复
ylj135cool
ylj135cool 嗯有可能是你说的这样,因为我跟踪调试发现到了GetWindowText函数的时候,整个锁死了……虽然不懂mfc是如何处理GetWindowText的,但是即使是阻塞的也应该造成死锁啊……
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片