Thread-sichere Singleton-Klasse

  • Ich habe diese Klasse erstellt, um ein threadsicheres Singleton zu simulieren.

    Habe ich etwas übersehen?

     #include <boost/thread/mutex.hpp>
    
    class Singleton
    {
    public:
      static Singleton& GetInstance()
      {
        boost::mutex::scoped_lock lock(m_mutex);
        static Singleton instance;
        return instance;
      }
    
    private:
      static boost::mutex m_mutex;
    
      Singleton() {}
      ~Singleton() {}
    
      Singleton(const Singleton&);
      const Singleton& operator=(const Singleton&);
    };
     
    01 November 2014
    Jamal
1 answer
  • Static m_mutex Member ist kein richtiger Singleton. Sie können dieses Singleton nicht zum Zeitpunkt der Initialisierung statischer Variablen verwenden, da m_mutex nicht faul erstellt und möglicherweise nicht initialisiert wird.

    Außerdem ist es falsch, die tatsächliche Logik auf Singleton Klasse, sollte es eine Template-Klasse sein.

     #ifndef SINGLETON_H_689E0B11_E731_4555_AFE6_88598B582F1D
    #define SINGLETON_H_689E0B11_E731_4555_AFE6_88598B582F1D
    
    #include <cassert>
    #include <boost/thread/mutex.hpp>
    
    template<class T>
    class Singleton
    {
    public:
      static T& GetInstance()
      {
        assert(!is_destructed);
        (void)is_destructed; // prevent removing is_destructed in Release configuration
    
        boost::mutex::scoped_lock lock(GetMutex());
        static T instance;
        return instance;
      }
    
    private:
      static bool is_destructed;
    
      static boost::mutex& GetMutex()
      {
        static boost::mutex mutex;
        return mutex;
      }
    
      Singleton() {}
      ~Singleton() { is_destructed = true; }
    };
    
    // force creating mutex before main() is called
    template<class T>
    bool Singleton<T>::is_destructed = (Singleton<T>::GetMutex(), false);
    
    #endif // SINGLETON_H_689E0B11_E731_4555_AFE6_88598B582F1D
     

    Da es einen privaten Destruktor hat, ist er nicht kopierbar - keine Notwendigkeit Deklarieren Sie den Copy-Operator und den Copy-Zuweisungsoperator.

    02 December 2011
    Jorn