Ist C ++ statisches Element Variableninitialisierung Thread-sicher?
-
21-09-2019 - |
Frage
Nach folgenden Ressourcen, in C ++ (speziell Visual C ++) scoped statische Variable Initialisierung nicht sicher ist, fädelt. Aber sind globale statische Variablen sicher.
Thema sichere statische Variablen ohne mutexing?
http://blogs.msdn.com/oldnewthing/ Archiv / 2004/03/08 / 85901.aspx
So ist folgender Code mit statischer Membervariable Thread-sicher?
class TestClass
{
public:
static MyClass m_instance;
}
Myclass TestClass::m_instance;
Vielen Dank im Voraus!
Lösung
Es ist mehr eine Frage der Funktion-scoped statischer Variablen gegen jede andere Art von statischen Variablen, anstatt scoped gegen Globals.
Alle nicht-Funktion-scope statischen Variablen werden vor der Haupt konstruiert (), während es nur einen aktiven Threads ist. Function-scope statische Variablen zum ersten Mal ihrer enthaltende Funktion aufgerufen werden konstruiert. Der Standard ist stumm auf die Frage, wie Funktionsebene Statik aufgebaut werden, wenn die Funktion auf mehreren Threads aufgerufen wird. jede Implementierung Ich habe mit Anwendungen eine Sperre um den Konstruktor gearbeitet (mit einem zweimal geprüft Flag) zu garantieren Thread-Sicherheit jedoch.
Andere Tipps
Ja (*). Wenn globale Statik initialisiert werden, gibt es nur einen Faden um und alle Konstrukteure werden sie aufgefordert hatte. Dies ist für die Funktion der Statik nicht wahr, wenn.
(*) Man kann möglicherweise globale Statik nicht Thread-sicher machen durch Fäden in einigen der Konstrukteure zu schaffen und auf diese Threads einige Initialisierung Stufen planen. In diesem Fall üblichen Fadensicherheitsregeln gelten.