如何在单例中正确连接()线程

How to correctly join() thread in a singleton

提问人:Toff 提问时间:10/21/2023 最后编辑:Toff 更新时间:10/21/2023 访问量:59

问:

我创建了一个简单的示例。 有一个带有两个按钮的窗口:开始和停止。

当您单击“开始操作”时:TTestThread::get().start();

当您单击“停止操作”时:TTestThread::get().stop();

TTestThread 类代码(单例):

void TTestThread::run()
{
    while (_runned) {
        using namespace std::chrono_literals;
        std::this_thread::sleep_for(10ms);
    }
}

void TTestThread::start()
{
    _runned.store(true);
    _testThread = std::thread(
        [this]() {
            run();
        });
}

void TTestThread::stop()
{
    _runned.store(false);
    if (_testThread.joinable()) {
        _testThread.join();
    }
}

TTestThread::~TTestThread()
{
    
}

TTestThread& TTestThread::instance()
{
    static TTestThread instance;
    return instance;
}

TTestThread& TTestThread::get()
{
    static std::once_flag flag;
    std::call_once(flag, [] { instance(); });
    return instance();
}
class TTestThread {

private:
    std::atomic<bool> _runned;
    std::thread _testThread;

private:
    void run();
    TTestThread() = default;
    ~TTestThread();
    static TTestThread& instance();

protected:
public:
    static TTestThread& get();
    void start();
    void stop();
};

如果用户按“开始”,然后按“停止”,然后关闭程序 - 一切都正确。如果用户按“开始”,然后关闭程序,则会引发异常“异常程序终止”。

如果只按下了“开始”按钮,但没有按下“停止”按钮,如何在程序结束时正确操作?

C++ 多线程 单例

评论

0赞 Miles Budnek 10/21/2023
调用窗口关闭处理程序(或注册处理程序)。stopatexit
0赞 Toff 10/21/2023
这是一个非常简单的解决方案,由于某种原因,我没有想到:)它有效,但它真的是最佳实践吗?
2赞 Pepijn Kramer 10/21/2023
单例已经不是一个好主意,但与线程和单元测试相结合更是如此。单元测试环境中的睡眠看起来也很可疑。考虑重新设计,看看依赖注入是如何工作的。你可以让一个包装类可以执行函数(lambda),在生产环境中,这个包装器可以在测试环境中使用线程,你可以给它一个execute(_next)方法,这样你的测试就可以完全控制什么时候执行什么。

答: 暂无答案