两种方法判断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设置一个成员变量,记录是否启动过线程workThrd、m_parseThrd就不说了。