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

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

4

2 回答 2

13

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

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

在你的类的析构函数中, doupdate = false和 callthread.join()

于 2013-08-30T19:27:25.947 回答
8

您无法停止分离的线程。这就是问题的关键——至少在 C++ 标准规定的范围内.detach(),您不再有任何方法可以引用分离的线程。如果要保留线程句柄,请将std::threadand存储.join()在析构函数中。

于 2013-08-30T19:26:52.653 回答