Da C ++ 11 die Initialisierung funktionierender statischer Variablen ist, ist die Gewinde. Die Variable wird (vermutlich durch einen Mutex) gesperrt und durch den ersten Thread initialisiert, der in die Funktion eingeht. < /P>
Dies muss bedeuten Ob die statischen Objekte in dieser Funktion initialisiert wurden. < /p>
Ist mein Glaube korrekt? Zumindest eine Prüfung jedes Mal, wenn die Funktion aufgerufen wird.std::mutex mutex;
bool bHasBeenInitialisedOuter = false; // ANY NUMBER OF THREADS COULD BE CHECKING THIS
bool bHasBeenInitialisedInner = false; // THIS IS A SECOND FLAG IN CASE THE RACE CONDITION ON THE FIRST FLAG MADE THE THREAD ENTER WHEN IT SHOULDN'T HAVE
void func()
{
if (!bHasBeenInitialisedOuter)
{
mutex.lock(); // ANY OTHER THREADS WAIT HERE
if (!bHasBeenInitialisedInner)
{
bHasBeenInitialisedInner = true;
// INITIALISE OBJECT
bHasBeenInitialisedOuter = true; // ANY NUMBER OF OTHER THREADS COULD BE CHECKING THIS AT THE TIME THIS THREAD WRITES TO IT
// HOWEVER IT SHOULDN'T MATTER BECAUSE THE INNER FLAG MEMORY IS FLUSHED BEFORE (OR WHEN) UNLOCKING THE MUTEX
}
mutex.unlock();
}
}
< /code>
Ich habe zwei Flags hinzugefügt, weil der erste Thread den Mutex gesperrt hat und er auf die Flagge geschrieben hat, die besagt, dass er initialisiert wurde, zu diesem Zeitpunkt könnten andere Threads diese Variable lesen. Und so ist es Rennbedingung, ist das richtig? > Was gerade auf True eingestellt wurde, ist auf globales Gedächtnis oder für andere Threads sichtbar. BR /> Obwohl es eine Rennbedingung für BhasbeeninitialiseDouter < /code> zu geben scheint, liegt dies innerhalb der Implementierung des Compilers. Ich glaube, dass dies nicht so ist, dass es sich um den Benutzercode handelt. < /p>
Ist dies so, wie C ++ statische Variablen initialisiert, um mit Atomvariablen zu eben?
Wie sind funktionierende statische Variablen initialisiert. ⇐ C++
-
- Similar Topics
- Replies
- Views
- Last post
-
-
Sind alle Objekte in Java erstellt, sind statische Objekte in der Hauptmethode?
by Anonymous » » in Java - 0 Replies
- 21 Views
-
Last post by Anonymous
-