遇到一种情况,在子线程程中调用了主线程方法,再使用多线程同步的话,会死锁,经过度娘的询问,发现也有朋友遇到同样的问题,于是写了一个测试代码如下:
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:小乌龟在大乌龟背上~