中断分离 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;
        }
    }
}