问题描述
- C++中多线程使用临界区域进行互斥,造成死锁,百思不得其解求指点为啥会死锁
- C++中多线程使用临界区域进行互斥,造成死锁,百思不得其解求指点为啥会死锁
// 在主界面中显示提示信息void CIOCPModel::_ShowMessage(const int columnconst CString szFormat...){ // 根据传入的参数格式化字符串 CString strMessage; va_list arglist; // 处理变长参数 va_start(arglist szFormat); strMessage.FormatV(szFormatarglist); va_end(arglist); EnterCriticalSection(&m_csTest); // 在主界面中显示 CAA_5Axis_SingleDlg* pMain = (CAA_5Axis_SingleDlg*)m_pMain; if( m_pMain!=NULL ) { //pMain->ShowMsg(strMessage); pMain->AddInformation(strMessagecolumn); TRACE( strMessage+_T(""n"") ); } LeaveCriticalSection(&m_csTest);}
上面的函数,在主线程和由主线程启动的多个子线程中都会被调用,单步跟踪的时候跟着跟着就死锁卡死了,百思不得其解,我有退出临界区啊,为啥还会死锁呢?
求大神解答···
PS:AddInformation(strMessagecolumn);是在主界面的ListControl中插入一项数据而已;
解决方案
更新界面的操作应该发消息让主线程自己去做。因为它们都是线程不安全的。
解决方案二:
CRITICAL_SECTION变量初始化了没
解决方案三:
进入临界区以后,你直接操作UI,可能AddInformation在操作界面的时候,mfc实现会有一些同步阻塞操作。这样可能会导致死锁。你应该用你更新界面没必要加锁。直接用PostMessage到主线程来更新界面。这是一个异步消息队列。这样主线程来一个个抽取消息更新界面
时间: 2024-11-18 12:18:27