繁体   English   中英

中断分离的boost :: thread

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM