Ich habe viele Fragen gelesen, die thread-safe Double Checked Locking (für Singletons oder Lazy Init) berücksichtigen. In einigen Threads lautet die Antwort, dass das Muster vollständig unterbrochen ist, andere schlagen eine Lösung vor.C++ 11: Sicheres doppelt geprüftes Sperren für verzögerte Initialisierung. Möglich?
Meine Frage ist also: Gibt es eine Möglichkeit, ein vollständig threadsicheres doppelt überprüftes Sperrmuster in C++ zu schreiben? Wenn ja, wie sieht es aus?
Wir können C++ 11 annehmen, wenn das die Dinge einfacher macht. Soweit ich weiß, hat C++ 11 das Speichermodell verbessert, was zu den notwendigen Verbesserungen führen könnte.
Ich weiß, dass es in Java möglich ist, indem Sie die Double-Check-Variable flüchtig machen. Da C++ 11 große Teile des Speichermodells von demjenigen von Java ausgeliehen hat, denke ich, dass es möglich sein könnte, aber wie?
Wenn Sie C++ 11 verwenden können, ignorieren Sie einfach das gesamte doppelt überprüfte Sperrgeschäft und verwenden Sie entweder statische lokale Variablen oder 'std :: call_once'. –
Werden statische Locals träge initialisiert? Und über 'call_once': Wie stellt dies sicher, dass der Aufruf einmal nicht den nicht vollständig erstellten Verweis auf die Variable schreibt? – gexicide
Ja, statische Einheimische werden auf thread-sichere Weise träge initialisiert. Und 'call_once' stellt sicher, dass das Thema nur einmal aufgerufen wird; und dass kein anderer Aufruf von 'call_once' zurückkommt, bevor derjenige, der die Funktion tatsächlich ausführt, zurückkehrt (Sie können hier mehr lesen http://en.cppreference.com/w/cpp/thread/call_once). Wie es funktioniert, hängt von der Implementierung ab. Diese zwei Dinge existieren im Grunde, so dass Sie sich nicht mehr mit dem Schreiben von
Bugsdoppelt geprüften Sperrimplementierungen beschäftigen möchten. –