У меня есть класс с нитью работает так:Прерывание отдельностоящего подталкивания :: нить
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()? А если да, то как прервать() выделенную нить?
у вас есть переменная mThreadShouldRun, просто добавьте мьютекс вызов перестает формируют основной поток – Netwave
Если мой поток спит, который является в большинстве случаев, я хочу, чтобы иметь возможность остановить его сразу. невозможно с mThreadShouldRun – grunk
ok, собираюсь отредактировать ответ, затем – Netwave