首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

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

高手请进:请问在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, ....)即可

热点排行