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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht eine gute Idee. Suchen Sie für double-check-locking. Zum Beispiel:
http://www.drdobbs.com/cpp/c-and-the-perils-of-double-checked-locki/184405726
http://www.drdobbs.com/cpp/c-and-the-perils-of-double-checked-locki/184405772
Es ist in der Tat nicht thread-sicher, da nach der Zeiger wird zurückgegeben, die Sie noch mit ihm zu arbeiten, obwohl der mutex wieder entsperrt.
Was Sie tun können, ist, dass die Kind-Klasse erbt von singleton thread-safe. Dann sind Sie gut zu gehen.