包含std :: thread的c ++ meyers singleton无法加入

时间:2016-01-04 16:32:52

标签: c++ multithreading join singleton destructor

我对斯科特迈耶斯单身人士有疑问。我的单例包含一个线程,该线程将在单例析构函数中加入,但join()永远不会返回。

当我在应用程序退出之前加入线程时,一切正常。我错过了什么吗?遵循我的代码:

#include <thread>
#include <atomic>
#include <iostream>
#include <chrono>

class Singleton
{
public:
    static Singleton& get_instance()
    {
        static Singleton instance;
        return instance;
    }

    void stop()
    {
        run = false;
        if (t.joinable()) 
            t.join();   
    }

private:
    Singleton() { t = std::thread{ &Singleton::f, this }; }
    ~Singleton()
    {
        std::cout << "dtor start" << std::endl;
        stop();
        std::cout << "dtor end" << std::endl; // <-- never gets called. programm freezes here
    }

    void f()
    {
        while (run)
        {
            // do work ...
            std::cout << "i do some work..." << std::endl;
            std::this_thread::sleep_for(std::chrono::milliseconds(500));
        }
    }

    std::atomic<bool> run = true;
    std::thread t;  
};

int _tmain(int argc, _TCHAR* argv[])
{
    auto& s = Singleton::get_instance();
    std::this_thread::sleep_for(std::chrono::seconds(2));

    s.stop(); // <-- works fine

    return 0;
}

正如我所提到的:调用s.stop();它工作正常但没有它“冻结”。

有没有办法阻止调用stop()?

0 个答案:

没有答案