Thread-sichere singleton in C++

Habe ich gelesen, über thread-sichere Singleton und die Umsetzung finde ich überall eine getInstance () - Methode so etwas wie dieses:

Singleton* getInstance()
{
    if ( !initialized )
    {
        lock();
        if ( !initialized )
        {
            instance = new Singleton();
            initialized = true;
        }
        unlock();
    }

    return instance;
}
  • Ist das eigentlich thread-safe?
  • Habe ich etwas verpasst oder gibt es eine kleine chance, dass diese Funktion gibt eine nicht initialisierte Instanz, weil 'initialisiert' können nachbestellt werden und die vor Instanz?

Dieser Artikel ist auf ein etwas anderes Thema, aber die top-Antwort beschrieben, warum ich denke, dass der obige code ist nicht thread-sicher:

Warum ist volatile nicht als nützlich bei der multithreaded C-oder C++ - Programmierung?

  • Nein, es ist nicht thread-sicher. Und naja, wenn du ein Singleton-dann bekommen Sie, was Sie sich wünschen, wirklich.
  • Oder, kurz gesagt, nicht das du etwas verpasst aber der Autor des Codes. Allerdings Frage ich mich, ob eine memory-Barriere zwischen der Zuordnung der Instanz und der Zuordnung initialisiert das problem beheben würde (unter der Annahme initialisiert, die den Typ volatile sig_atomic_t).
  • In Betracht ziehen: stackoverflow.com/questions/6086912/...
  • Ein memory-Barriere war mein Gedanke auch.
InformationsquelleAutor digby280 | 2012-08-12
Schreibe einen Kommentar