中断一个分离的 boost::thread
Posted
技术标签:
【中文标题】中断一个分离的 boost::thread【英文标题】:Interrupt a detached boost::thread 【发布时间】:2015-11-10 08:17:29 【问题描述】:我有一个这样的线程运行的类:
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()
方法中中断它,因为在调用detach()
后mThread 不再引用该线程。
我真的应该调用 detach() 吗?如果是,如何中断()分离的线程?
【问题讨论】:
你有一个 mThreadShouldRun 变量,只需在主线程中添加一个互斥锁和调用停止 如果我的线程处于休眠状态,这是大多数情况下的情况,我希望能够立即停止它。 mThreadShouldRun 不可能 好的,然后编辑答案 请问为什么会出现睡眠行为? 这是一个后台线程定期(每隔几秒)获取信息。获取信息很快,但我需要定期更新。 (如果您愿意,可以像 CPU 使用线程一样) 【参考方案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;
【讨论】:
以上是关于中断一个分离的 boost::thread的主要内容,如果未能解决你的问题,请参考以下文章
boost::thread interrupt() 仅在第一次执行中断点时引发异常?
boost::this_thread::interruption_point() 不会抛出 boost::thread_interrupted& 异常