struct threadinforM 
{
UINT NSECOND;
CProgressCtrl * pc;
};//一个全局变量结构体
UINT Thfun(LPVOID lpParam);//线程函数
void CMuthread3Dlg::OnButton1() 
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
infor.NSECOND = m_second;
infor.pc = &m_ctr;
hthread = CreateThread(
NULL,0,
(LPTHREAD_START_ROUTINE)Thfun,
&infor,
0,
&threadID);
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
WaitForSingleObject(hthread,INFINITE);//导致线程死锁
GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
}
UINT Thfun(LPVOID lpParam)
{
threadinforM * pinfo = (threadinforM * )lpParam;
for (int i=0;i<100;i++)
{
int ntem = pinfo->NSECOND;
pinfo->pc->SetPos(i);
Sleep(ntem);
}
return 0;
}书上的讲解是:::
WaitForSingleObject函数等待子线程(ThreadFunc)结束时,导致了线程死锁。因为WaitForSingleObject函数会将主线程挂起(任何消息都得不到处理),而子线程ThreadFunc正在设置进度条,一直在等待主线程将刷新消息处理完毕返回才会检测通知事件。这样两个线程都在互相等待,死锁发生了
麻烦高手给我讲解一下,子线程在等待什么??这个是怎么导致线程死锁的

解决方案 »

  1.   

    线程里面最好不要直接操作UI,可以在线程里postmessage给主线程,让其自己刷新。
    MFC里很多成员函数都是通过消息来实现的,就像SetPos也是这样,跨线程的SendMessage会导致当前线程被挂起,直到对方响应消息完才恢复(印象中好像是这样,具体可参考windows核心编程第四版第26章),而主线程waitforsingleobject要一直等子线程自然结束(线程结束了,句柄这个内核对象才会变成有信号状态,wait才会返回)退出了才会返回,所以就会出现死锁
      

  2.   

    SetPos会给主线程发送消息,而此时主线程在WaitForSingleObject所以主线程已经被阻塞而无法处理子线程的SetPos消息,于是子线程等着SetPos消息被处理而无法退出,主线程就只能一直阻塞着,造成死锁。
      

  3.   


    ++还有跨线程使用mfc类的问题。如果不是mfc类,可以使用msgwaitformutipleobjects这个函数
    具体可以参考文章
    http://blog.csdn.net/qingfeng_happy5/article/details/3515283