zoukankan      html  css  js  c++  java
  • 两种方法判断boost线程是否在运行

    场景:有类crawler,以及它的对象 _pService。crawler类中声明了两个boost thread成员变量:

    1     boost::thread m_workThrd;
    2     boost::thread m_parseThrd;

    由外部线程在需要的时候调用_pService->fun()来启动这两个线程,并给成员变量workThrd、parseThrd赋值

    _pService对象也可能没有调用_pService->fun(),因此workThrd、parseThrd可能就是初始值。

    在程序退出时,workThrd、parseThrd如果已经启动并在运行了,就需要停止这两个线程;如果没有启动过,就不需要主动来停止了。

    问题:如果判断这两个线程有没有在运行呢?

    查阅boost文档,发现有以下两种办法:

    (1)检查线程是否是joinable(),如下:

     1     if(m_workThrd.joinable())
     2     {
     3         m_workThrd.interrupt();
     4     }
     5 
     6     if(m_parseThrd.joinable())
     7     {
     8         m_parseThrd.interrupt();
     9     }
    10 
    11     //wait for the threads to exit.
    12     m_workThrd.join();
    13     m_parseThrd.join();

    (2)判断线程id是否有效,如下:

     1     boost::thread::id _not_a_thread;
     2     if(m_workThrd.get_id() != _not_a_thread)
     3     {
     4         m_workThrd.interrupt();
     5     }
     6 
     7     if(m_parseThrd.get_id() != _not_a_thread)
     8     {
     9         m_parseThrd.interrupt();
    10     }

    其实还有第三种办法:类crawler设置一个成员变量,记录是否启动过线程workThrdm_parseThrd就不说了。

  • 相关阅读:
    平安夜前夜,我在上海沐恩堂度过
    吃匹萨的数学
    2004语录
    爱的罗曼斯
    转发: 上季度全球最佳短篇小说《最后一趟生意》
    一个人的元宵节
    超越纪念我的blog排名上升到第六位
    读《仆人》
    我的龟宝宝病了:( 谁来救救她?
    春晚
  • 原文地址:https://www.cnblogs.com/chutianyao/p/2606215.html
Copyright © 2011-2022 走看看