zoukankan      html  css  js  c++  java
  • 关于线程安全退出

    [cpp] view plain copy
     
    1. ...  
    2. m_hEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);  
    3. ...  
    4. while (TRUE)  
    5. {  
    6.  // 等待  
    7.  ::WaitForSingleObject(pThis->m_hEvent, INFINITE);  
    8.  if (pThis->GetStop())  
    9.  {  
    10.   // 取消  
    11.   break;  
    12.  }  
    13.   
    14.  pThis->StartWork(TRUE);  
    15. }  
    16.   
    17. ...  
    18. m_bstop = TRUE;  
    19. ::SetEvent(m_hEvent);  
    20. ...  

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

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

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

    [cpp] view plain copy
     
    1. ...  
    2. m_hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);  
    3. ...  
    4. while (TRUE)  
    5. {  
    6.  // 等待  
    7.  if (WAIT_TIMEOUT == ::WaitForSingleObject(pThis->m_hEvent, 200))  
    8.  {  
    9.   if (pThis->GetStop())  
    10.   {  
    11.    // 取消  
    12.    break;  
    13.   }  
    14.   continue;  
    15.  }  
    16.  ::ResetEvent(pThis->m_hEvent);  
    17.  if (pThis->GetStop())  
    18.  {  
    19.   // 取消  
    20.   break;  
    21.  }  
    22.   
    23.  pThis->StartWork(TRUE);  
    24. }  
    25. ...  
    26. m_bstop = TRUE;  
    27. ::SetEvent(m_hEvent);  
    28. ...  

      

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

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

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

    http://blog.csdn.net/magictong/article/details/4041696

  • 相关阅读:
    开源协议介绍
    Guice vs Dependency Injection By Hand
    Eclipse与MyEclipse的联系和区别
    Java Basic
    解决Windows Vista 英文版中文软件乱码
    [转]Java B/S开发模式漫谈
    什么是Groovy
    JBoss, Geronimo, Tomcat
    一个让你迅速理解Javabean的实例
    keepalive 原理讲解 salami
  • 原文地址:https://www.cnblogs.com/findumars/p/6145962.html
Copyright © 2011-2022 走看看