c++ - 中断分离的 boost::thread

标签 c++ boost boost-thread detach

我有一个线程像这样运行的类:

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() 吗?如果是,如何中断()分离线程?

最佳答案

只需中断线程然后等待它返回:

#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;
        }
    }
}

关于c++ - 中断分离的 boost::thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33625502/

相关文章:

c++ - 在 C++ 中,基类是否可以在所有派生类中调用虚拟方法?

c++ - C++ 正向/双向/随机迭代器是否总是输出迭代器?

c++ - 同时调用 async_send 和 async_receive 线程安全吗?

c++ - 线程占用内存

c++ - 对 `boost::chrono::system_clock::now()' 的 undefined reference - Boost 和 cpp-netlib

c++ - 光线追踪 : Sphere distortion due to Camera Movement

c++ - 将 Q3DSurface 嵌入到 QQuickItem 中

c++ - std::optional 和 boost::optional 是否遵守托管对象的对齐限制?

c++ - boost multi_index 是如何实现的

boost - 使用 boost::asio::io_service::post()