12 Stimmen

Threadsichere Singleton-Implementierung in C++

Im Folgenden wird eine bekannte Implementierung des Singleton-Musters in C++ vorgestellt.
Ich bin mir jedoch nicht ganz sicher, ob es thread-sicher ist.
Ausgehend von den Antworten auf ähnliche Fragen, die hier zuvor gestellt wurden, scheint es sicher zu sein.
Ist das so?

//Curiously Recurring Template Pattern    
//Separates a class from its Singleton-ness (almost).    
#include <iostream>  
using namespace std;

template<class T> class Singleton {
  Singleton(const Singleton&);
  Singleton& operator=(const Singleton&);
protected:
  Singleton() {}
  virtual ~Singleton() {}
public:
  static T& instance() {
    static T theInstance;
    return theInstance;
  }
};

// A sample class to be made into a Singleton
class MyClass : public Singleton<MyClass> {
 int x;
protected:
  friend class Singleton<MyClass>;
  MyClass() { x = 0; }
public:
 void setValue(int n) { x = n; }
  int getValue() const { return x; }
};

0 Stimmen

Warum haben Sie daraus ein WIKI gemacht? Das ist eine völlig berechtigte Frage.

0 Stimmen

Sie haben keine Gründe genannt, warum Sie dass die Implementierung des Musters nicht thread-sicher ist. Bitte tun Sie das.

0 Stimmen

Was ist das Ziel der Freundschaftsklasse? Kann mir das jemand beantworten?

13voto

JaredPar Punkte 699699

Nein, dies ist nicht thread-sicher, weil die statische lokale nicht in irgendeiner Weise bewacht wird. Standardmäßig ist ein statisches Local nicht thread-sicher. Dies bedeutet, dass Sie in die folgenden Probleme laufen könnte

  • Der Konstruktor für das Singleton wird mehr als einmal ausgeführt
  • Die Zuweisung an die Statik ist nicht garantiert atomar, so dass in Multithreading-Szenarien eine teilweise Zuweisung auftreten kann.
  • Wahrscheinlich gibt es noch ein paar mehr, die ich übersehen habe.

Hier ist ein detaillierter Blogeintrag von Raymond Chen darüber, warum C++ Statics nicht standardmäßig thread-sicher sind.

0 Stimmen

So im Grunde bedeutet dies, dass es nicht möglich ist, ein OS agnostic Singleton mit C++ zu tun? d.h. Sie benötigen immer einige kritische Abschnitt oder ähnliches, um eine zu tun?

1voto

ES IST NICHT DRAHTSICHER. Um thread-sicher zu werden, sollten Sie eine Prüfung vor der Sperre (Semaphorensperre) und eine weitere Prüfung nach der Sperre hinzufügen. Dann sind Sie sicher, dass Sie auch bei gleichzeitigem Aufruf von verschiedenen Threads eine Instanz bereitstellen.

0voto

Rhythmic Fistman Punkte 32892

Er ist nicht thread-sicher, es sei denn, Sie konfigurieren Ihren Compiler so, dass er thread-sicheren Code für statische Zugriffe erzeugt.

Allerdings ist es besser, dass der Code in sich geschlossen ist, also würde ich hier und da einen Mutex hinzufügen.

0voto

Silviu Punkte 93

Wenn Sie noch Interesse an diesem Thema haben und eine C++ 11 Standard-Compiler finden Sie aquí ein Vorschlag für das Singleton-Muster in einer Multithreading-Umgebung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X