2015-11-10 9 views
0

У меня есть класс с нитью работает так:Прерывание отдельностоящего подталкивания :: нить

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 questionjoin() или 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

ok, собираюсь отредактировать ответ, затем – 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; 
     } 
    } 
}