C++ 中断分离的boost::线程

C++ 中断分离的boost::线程,c++,boost,boost-thread,detach,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 =

我有一个类,其线程运行如下:

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()

线程仍按预期运行,但
mThread
变为,我无法再在
Stop()
方法中中断它,因为调用
detach()
后,mThread不再引用线程


我真的应该调用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;
        }
    }
}
#包括
类MyClass
{
公众:
void Start();
无效停止();
无效运行();
私人:
boost::线程mThread;
bool mthread应该运行;
}
void MyClass::Start()
{
mThreadShouldRun=true;
mThread=boost::thread(&MyClass::Run,this);
}
void MyClass::Stop()
{
mThreadShouldRun=false;//实际上不再需要,但可能还可以
中断();
mThread.join();
}
void MyClass::Run()
{
while(mthreadshouldlrun)
{
//做点什么
试一试{
boost::this_线程::sleep_for(boost::chrono::seconds(15));
}捕获(boost::线程中断){
打破
}
}
}

您有一个mthreadshouldldrun变量,只需从主线程添加一个互斥锁和一个调用停止。如果我的线程处于睡眠状态,大多数情况下都是这种情况,我希望能够立即停止它。MThread shouldlrunok不可能,要编辑答案,然后我可以问一下为什么会出现睡眠行为吗?这是一个定期(每隔几秒钟)获取信息的后台线程。获取信息很快,但我需要定期更新。(如果愿意,可以选择CPU使用线程)
#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;
        }
    }
}