gpt4 book ai didi

c++ - std::thread::detach 在原始调用者被销毁后导致崩溃

转载 作者:可可西里 更新时间:2023-11-01 18:09:03 25 4
gpt4 key购买 nike

struct Test {
bool active{true};

void threadedUpdate() {
std::this_thread::sleep_for(std::chrono::milliseconds(1));
if(!active) // crashes here after Test instance is destroyed
return;
}

Test() {
std::thread([this]{ while(true) threadedUpdate(); }).detach();
}

~Test() {
// somehow stop the detached thread?
}
};

Test 的实例被初始化时,它会生成并分离一个在后台运行的 std::thread。当同一个实例被销毁时,前面提到的线程会尝试访问与实例一起被销毁的 active 成员,从而导致崩溃(以及 AddressSanitizer 回溯)。

有没有办法停止 ~Test() 上的分离线程?

设计很糟糕。 在调用者被销毁之前在后台运行的线程应该如何正确生成/处理?

最佳答案

使线程成为类的成员,而不是在构造函数中分离它,而是在析构函数中加入它。要停止线程循环,您可以在类中使用一个 bool 值来指示线程是否应该继续运行 (std::atomic<bool> update)。

线程可能正在执行:[this] { while (update) threadUpdate(); } .

在你的类的析构函数中,执行 update = false , 并调用 thread.join()

关于c++ - std::thread::detach 在原始调用者被销毁后导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18540108/

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