一个线程死锁的问题
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正在设置进度条,一直在等待主线程将刷新消息处理完毕返回才会检测通知事件。这样两个线程都在互相等待,死锁发生了
麻烦高手给我讲解一下,子线程在等待什么?? 这个是怎么导致线程死锁的
[解决办法]
线程里面最好不要直接操作UI,可以在线程里postmessage给主线程,让其自己刷新。
MFC里很多成员函数都是通过消息来实现的,就像SetPos也是这样,跨线程的SendMessage会导致当前线程被挂起,直到对方响应消息完才恢复(印象中好像是这样,具体可参考windows核心编程第四版第26章),而主线程waitforsingleobject要一直等子线程自然结束(线程结束了,句柄这个内核对象才会变成有信号状态,wait才会返回)退出了才会返回,所以就会出现死锁
[解决办法]
SetPos会给主线程发送消息,而此时主线程在WaitForSingleObject所以主线程已经被阻塞而无法处理子线程的SetPos消息,于是子线程等着SetPos消息被处理而无法退出,主线程就只能一直阻塞着,造成死锁。