中断一个分离的 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

boost::thread interrupt() 仅在第一次执行中断点时引发异常?

Boost Thread - 如何确认中断

如果未加入则中断线程

中断指令的数据范围

boost::this_thread::interruption_point() 不会抛出 boost::thread_interrupted& 异常