MFC 多线程WaitForSingleObject死锁

遇到一种情况,在子线程程中调用了主线程方法,再使用多线程同步的话,会死锁,经过度娘的询问,发现也有朋友遇到同样的问题,于是写了一个测试代码如下:


MyMutex g_mutex;//自己封装的Mutex,简单的APi封装
bool g_exit=false;
HANDLE g_hThread;


UINT DoWork(LPVOID lp)
{
    CMFC_TEST_MULTITHREADDlg *pMain=(CMFC_TEST_MULTITHREADDlg*)lp;

    while(TRUE)
    {
        g_mutex.Lock(INFINITE);

        if(g_exit)
        {
            break;  
        }

        static int i=0;
        CString str;
        str.Format("%d",i);
        pMain->GetDlgItem(IDC_STATIC)->SetWindowText(str);
        pMain->GetDlgItem(IDC_EDIT1)->SetWindowText(str);
        i++;

        Sleep(10);
        g_mutex.Unlock();
    }
    g_mutex.Unlock();
    AfxMessageBox("子线程完毕!");
    return 1;
}

解释:子线程调用主线程方法并显示界面。
再在界面添加一个按钮事件,操作如下:

void CMFC_TEST_MULTITHREADDlg::OnButton1() 
{
    g_exit=!g_exit;
    g_mutex.Lock(INFINITE); 
    g_mutex.Unlock();
    AfxMessageBox("主线程完毕");
}

发现一点击按钮,就使程序卡死,怎么会这样?我的天,问题肯定出在Lock()上,即WaitForSingleObject(),经过查找资料如下:

解释:WaitForSingleObject()会让线程的一切活动停止,包括消息循环,这个消息循环一下子提示了我,子线程中不正是通过消息来改变的窗口的状态的吗?当子线程执行到关于主线程的操作时,子线程就会卡在这里,向主窗口发消息发不出去,子线程即等待状态,此时的Mutex没有释放,主窗口也在等待子线程的unlock(),于是双方等待状态了。也就造成了界面的卡死。

解决方案:1:使用CMutex可以解决如上问题。
      2:使用msgWaitForMultiObject();该方法,即消息等待,该方法始终会返回值! msgWaitForMultiObject参考代码

更多文章:http://blog.csdn.net/what951006?viewmode=list
powered by:小乌龟在大乌龟背上~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值