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

这样安全的代码,还说会死锁。 无语

2012-08-01 
这么安全的代码,还说会死锁。 无语C/C++ code在以下代码中,线程Thread退出时,可能会要UI线程互锁void CTagS

这么安全的代码,还说会死锁。 无语

C/C++ code
在以下代码中,线程Thread退出时,可能会要UI线程互锁void CTagScanPCDlg::StopRead(){       if (m_hEvent != NULL) //线程结束等待事件       {              SetEvent(m_hEvent);       }       if (m_hThreadRead != NULL)       {                  WaitForSingleObject(m_hThreadRead,INFINITE);     //等待线程结束              DWORD dwExitCode = 0;               m_hThreadRead = NULL;       }                  m_hEvent = NULL;}DWORD WINAPI CTagScanPCDlg::ReadThread(LPVOID lpParam){       while (WaitForSingleObject(pDlg->m_hEvent,0) == WAIT_TIMEOUT){       …… pDlg->SetDlgItemText(IDC_TAGGROUP,(LPCTSTR)szTextTitle);   //操作UI元素       ……}……}


这么安全的代码,还说会死锁。 无语

[解决办法]
要不就是他没把东西帖全,要不就是他理解错了。

如果那人的代码里,创建event时,bManualReset传得是true,那么Delay代码没什么用
while(WaitForSingleObject(hEvent,0) == WAIT_TIMEOUT) 这个不会是timeout,退出循环,退出delay函数了。

如果bManualReset是false,那么delay里的wait就有可能把之前自己的setEvent给吃了,然后退出,继续运行到之后的wait。
而ReadThread里的 while (WaitForSingleObject(pDlg->m_hEvent,0) == WAIT_TIMEOUT) 就会是timeout,Event已经被那delay里的wait重置了。
然后进入循环
 pDlg->SetDlgItemText(IDC_TAGGROUP,(LPCTSTR)szTextTitle);
现在可以运行这句操作UI了(如果这个就是他指的操作UI的话),但这个才叫死循环(如果没贴出的代码里没有其他退出while的方法)。

热点排行
Bad Request.