MFC 多线程WaitForSingleObject死锁
2017-05-22 16:46
344 查看
遇到一种情况,在子线程程中调用了主线程方法,再使用多线程同步的话,会死锁,经过度娘的询问,发现也有朋友遇到同样的问题,于是写了一个测试代码如下:
解释:子线程调用主线程方法并显示界面。
再在界面添加一个按钮事件,操作如下:
发现一点击按钮,就使程序卡死,怎么会这样?我的天,问题肯定出在Lock()上,即WaitForSingleObject(),经过查找资料如下:
解释:WaitForSingleObject()会让线程的一切活动停止,包括消息循环,这个消息循环一下子提示了我,子线程中不正是通过消息来改变的窗口的状态的吗?当子线程执行到关于主线程的操作时,子线程就会卡在这里,向主窗口发消息发不出去,子线程即等待状态,此时的Mutex没有释放,主窗口也在等待子线程的unlock(),于是双方等待状态了。也就造成了界面的卡死。
解决方案:1:使用CMutex可以解决如上问题。
2:使用msgWaitForMultiObject();该方法,即消息等待,该方法始终会返回值! msgWaitForMultiObject参考代码
更多文章:http://blog.csdn.net/what951006?viewmode=list
powered by:小乌龟在大乌龟背上~
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:小乌龟在大乌龟背上~
相关文章推荐
- 主线程中调用WaitForSingleObject函数造成的死锁问题
- 多线程中sleep与WaitForSingleObject的区别?
- 多线程访问文件问题中WaitForSingleObject方法的使用,及其效率!
- WaitForSingleObject的用法 控制多线程
- 多线程之 WaitForSingleObject 等待函数
- 多线程1---------WaitForSingleObject
- 用WaitForSingleObject()函数实现简单的多线程互斥访问
- Boost条件变量condition_variable_any的notify_one和wait与mfc中CEvent和WaitForSingleObject区别
- 多线程编程WaitForSingleObject()
- 多线程编程之四:WaitForSingleObject的详细用法
- 多线程 WaitForSingleObject
- 多线程编程里如何运用CreateMutex,WaitForSingleObject,ReleaseMutex来实现线程同步
- 在MFC中使用WaitForSingleObject出现假死
- 多线程中的 WaitForSingleObject 与 EnterCriticalSection 性能比较
- 多线程编程学习4——WaitForSingleObject
- [zz]多线程中的 WaitForSingleObject 与 EnterCriticalSection 性能比较
- WaitForSingleObject
- WaitForSingleObject和WaitForMultipleObjects使用详解
- Windows API一日一练(43)WaitForSingleObject函数
- 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)