中断分离 boost::thread
Interrupt a detached boost::thread
我有一个 class 的线程 运行 是这样的:
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() 吗?如果是,如何中断()分离的线程?
只需中断线程,然后等待它return:
#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;
}
}
}
我有一个 class 的线程 运行 是这样的:
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() 吗?如果是,如何中断()分离的线程?
只需中断线程,然后等待它return:
#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;
}
}
}