关于线程安全退出

 

      分享一点关于线程安全退出的东东:

      前因:工作线程不是总处于working状态,大部分时间可能处于等待状态,收到“取消”的消息后怎么退出;
      方法:使用bool stop标识,当stop为true的时候退出,但是线程在WaitForSingleObject的时候必须激活该线程,所以还需要一个事件来激活它,之前我用了一个自动重置的event,后来发现自动重置的event偶尔会丢失激活事件,譬如说,线程进入pThis->StartWork(TRUE);之后,外面来了一个取消事件激活了事件,但是线程再次走到WaitForSingleObject的时候却不会等到该事件,该事件被系统抛弃了(具体来说就是激活一个自动重置的事件时,系统中并没有一个wait族函数等待该事件,这个状态不会被系统保存下来,换句话说,这个event的该次激活被遗失了,具体是指PulseEvent激活的,SetEvent激活的还没发现问题);

      解决方法:使用手动重置的event,另外建议不要无穷等待,代码如下:

   

 

      下面是来之zeno的分享::-)

      跟大家分享一个多线程编程的BUG经验:
      场景:
            A.线程正在运行,且线程函数会调用UI类中的会更新界面的成员函数
            B.在UI类的按钮消息函数中停止线程运行。
      结果:线程在调用UI类中的会更新界面的成员函数会CRASH。
      原因:“UI类的按钮消息函数中停止线程运行” 与 “UI类中的会更新界面的成员函数”同在UI线程的消息循环中,会引起死锁,这种情况下,一些等待函数(如WaitForSingleObject)会超时,导致某一方的代码调不到,从而导致异常逻辑,CRASH就发生了。

建议解决方案:避免“UI类的按钮消息函数中停止线程运行” 与 “UI类中的会更新界面的成员函数”发生死锁,避免的方法很多了,各自在具体编程时可自行决定(如使用标识变量等)

 

[END]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值