Why does this C++ static singleton never stop?

前端 未结 6 597
旧时难觅i
旧时难觅i 2020-12-28 08:48

i have implemented a singleton (static version) in C++. I know all the controversy about this pattern and potential thread-safety issues, but i am curious why this exact imp

6条回答
  •  天涯浪人
    2020-12-28 09:09

    Ok thank you all for your hints. Apparently this pattern implementation results in a deadlock on VC++.

    After doing some further research i found this implementation based on C++11 mechanics which is working in VC++.

    singleton.h

    #pragma once
    #include 
    #include 
    #include 
    #include 
    
    
    class Singleton
    {
    public:
        static Singleton& getInstance();
        virtual ~Singleton();
    
    private:
        static std::unique_ptr mInstance;
        static std::once_flag mOnceFlag;
        std::thread mThread;
        std::atomic_bool mRun;
    
        Singleton();
    
        void threadFoo();
    };
    

    singleton.cpp

    #include "singleton.h"
    
    std::unique_ptr Singleton::mInstance = nullptr;
    std::once_flag Singleton::mOnceFlag;
    
    
    Singleton& Singleton::getInstance()
    {
        std::call_once(mOnceFlag, [] { mInstance.reset(new Singleton); });
        return *mInstance.get();
    }
    
    
    Singleton::Singleton()
    {
        mRun.store(true);
        mThread = std::thread(&Singleton::threadFoo, this);
    }
    
    Singleton::~Singleton()
    { 
        mRun.store(false);
    
        if(mThread.joinable())
            mThread.join();
    }
    
    void Singleton::threadFoo()
    {
        while(mRun.load())
        {
        }
    }
    

    UPDATE

    It looks like Microsoft is aware of this issue. In the VC++ forums a user named "dlafleur" reported this post: https://connect.microsoft.com/VisualStudio/feedback/details/747145

提交回复
热议问题