Прервать отдельный буст :: поток

У меня есть класс с потоком, работающим так:

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;
}
}
}

Этот код делает то, что я ожидаю: запуск фонового потока и остановка его по требованию.

Но согласно ответу этот вопрос join() или же detach() всегда должен называться. join() это не то, что мне нужно в моем случае, поэтому я иду на detach() :

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

Поток все еще работает, как и ожидалось, но mThread становиться Не-а-Thread и я больше не могу прерывать его в Stop() метод, потому что mThread больше не ссылается на поток после вызова detach(),

Должен ли я действительно вызвать detach ()? И если да, как прервать () оторванный поток?

0

Решение

Просто прервите поток и дождитесь его возврата:

#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;
}
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]