两种方法判断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就不说了。

 

posted @ 2012-07-24 11:28    阅读(1342)  评论(0编辑  收藏  举报