读书人

:请教在Dialog里面为什么会死锁?

发布时间: 2012-01-26 19:40:46 作者: rapoo

高手请进:请问在Dialog里面为什么会死锁???
最近在研究Win32的同步,写了一小段代码进行测试,使用的是向导产生的基本Dialog工程。

在BOOL CMyDlg::OnInitDialog()中添加

HANDLE hand1 = ::CreateMutex(NULL, FALSE, "mutex ");
::AfxBeginThread(testmutex,(LPVOID)this,THREAD_PRIORITY_NORMAL);
::Sleep(100);//很奇怪,只要有它一定死锁。
WaitForSingleObject(hand1, INFINITE);
AfxMessageBox( "Main ");
ReleaseMutex(hand1);
::CloseHandle(hand1);

新启动线程是这样写的:
UINT CMyDlg::testmutex(LPVOID pParam)
{
HANDLE hand1 = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "mutex ");
WaitForSingleObject(hand1, INFINITE);
AfxMessageBox( "Mutex! ");
ReleaseMutex(hand1);
return 0;
}

但是我发现只要sleep了,就一定会死锁。请教高手,这是为什么?

[解决办法]
如果加上了Sleep(100),主线程睡眠,重新调度,那么多半你所创建的线程先执行。这样,你的新线程获得了Mutex,然后调用AfxMessageBox,AfxMessageBox调用下面的代码:
int CWinApp::ShowAppMessageBox(CWinApp *pApp, LPCTSTR lpszPrompt, UINT nType, UINT nIDPrompt)
而在这个函数中会给主窗口(也就是你的Dialog)发消息:
LRESULT lResult = ::SendMessage(hWnd, WM_HELPPROMPTADDR, 0, 0);
因为你的主线程因为正在等待Mutex而无法处理消息,所以产生了死锁。

解决方法:很简单,把AfxMessageBox换成::MessageBox(NULL, ....)即可

读书人网 >VC/MFC

热点推荐