您的位置:首页 > 移动开发 > Objective-C

MFC 多线程WaitForSingleObject死锁

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

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:小乌龟在大乌龟背上~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: