2015-11-10 45 views
0

我有一个类与运行这样一个线程:中断分离的boost ::线程

class MyClass 
{ 
    public: 
     void Start(); 
     void Stop(); 
     void Run(); 
    private: 
     boost::thread mThread; 
     bool mThreadShouldRun; 
} 

void MyClass::Start() 
{ 
    mThreadShouldRun = true; 
    mThread = boost::thread(&MyClass::Run, this); 
} 

void MyClass::Stop() 
{ 
    mThreadShouldRun = false; 
    mThread.interrupt(); 
} 

void MyClass::Run() 
{ 
    while(mThreadShouldRun) 
    { 
     //DO Something 
     try { 
      boost::this_thread::sleep_for(boost::chrono::seconds(15)); 
     } catch(boost::thread_interrupted interrupt) { 
      break; 
     } 
    } 
} 

这段代码是做什么的我期待:启动一个后台线程并停止它的需求。

但是根据this question的答案join()detach()应该总是被调用。 join()是不是我需要在我的情况,所以我去detach()

void MyClass::Start() 
{ 
    mThreadShouldRun = true; 
    mThread = boost::thread(&MyClass::Run, this); 
    mThread.detach(); 
} 

线程仍在运行的预期,但mThread成为Not-a-Thread,我再也不能中断它在Stop()方法,因为mThread没有长引用在致电detach()之后线程。

我真的应该叫detach()吗?如果是的话如何中断()分离的线程?

+0

你有mThreadShouldRun变量,只需添加一个互斥体的叫停形成主线程 – Netwave

+0

如果我的线程是睡觉,这是大多数情况下,我希望能够立即停止它。不可能与mThreadShouldRun – grunk

+0

好吧,要编辑答案然后 – Netwave

回答

1

就中断线程,然后等待它返回:

#include <mutex> 
class MyClass 
{ 
    public: 
     void Start(); 
     void Stop(); 
     void Run(); 
    private: 
     boost::thread mThread; 
     bool   mThreadShouldRun; 
} 

void MyClass::Start() 
{ 
    mThreadShouldRun = true; 
    mThread = boost::thread(&MyClass::Run, this); 
} 

void MyClass::Stop() 
{ 
    mThreadShouldRun = false;// dont really needed anymore but may be ok 
    mThread.interrupt(); 
    mThread.join(); 
} 

void MyClass::Run() 
{ 
    while(mThreadShouldRun) 
    { 
     //DO Something 
     try { 
      boost::this_thread::sleep_for(boost::chrono::seconds(15)); 
     } catch(boost::thread_interrupted interrupt) { 
      break; 
     } 
    } 
}