SendMessage导致的死锁问题

前言:

试想这样一种场景:
子线程通过SendMessage同步消息到主线程,假设子线程的结束是通过标志位来控制的。当主线程想要尝试结束子线程的时候
一般是这样操作的,

bFlag = false;
WaitForSingleObject(hThread,INFINITE);   //阻塞等待
CloseHandle(hThread);

将标志位置为false后,在子线程的主循环中肯定会判断,false将会退出,假设当主线程执行了WaitForSingleObject后,
子线程恰好执行到了SendMessage函数,SendMessage本身就是阻塞的,需要等到主线程回应才继续往下执行。
这便造成了死锁——主线程等子线程结束,子线程等主线程执行同步,相互等待。

解决方案

处理方法有很多,比如:
1、子线程改用PostMessage();
2、主线程改用MsgWaitForMultipleObjects();

但是有一些场景是不能用PostMessage的,例子就不举了,说一下第二种方案,实现代码如下:

while(true)
{
    if(WAIT_OBJECT_0 == MsgWaitForMultipleObjects(1,&m_hThread,false,INFINITE,QS_ALLINPUT))
    {
        break;
    }
    else
    {
        if(PeekMessage(&mymsg,m_hWnd,0,0,PM_REMOVE))
        {
            TranslateMessage(&mymsg);
            DispatchMessage(&mymsg);
        }
    }
}

CloseHandle(m_hThread);

这样做可以让主线程既等待子线程,又可以处理消息,不至于子线程SendMessage时导致死锁。

注意

这样会使程序是非阻塞的,比如按钮点了又可以点,处理要小心一点。比如有个按钮功能是停止线程,用户点了又可以点,最好能让按钮失效。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇龍_

若帮助到你,希望能给予鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值