[英]Interrupt a detached boost::thread
我有一个带有这样的线程运行的类:
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
变为非线程,并且我无法再在Stop()
方法中中断它,因为mThread在调用detach()
之后不再引用该线程。
我真的应该叫detach()吗? 如果是的话,如何中断分离的线程?
只需中断线程,然后等待它返回即可:
#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;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.