gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:17:29 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com