Falsche Synchronisierung in Go Lang
Das Go-Speichermodell legt fest, dass sich Lese- und Schreibvorgänge in einer einzelnen Goroutine so verhalten müssen, als ob sie in ausgeführt würden die vom Programm vorgegebene Reihenfolge. Bei der Verwendung mehrerer Goroutinen tritt jedoch ein eigenartiges Verhalten auf, wie der folgende Code zeigt:
var a, b int func f() { a = 1 b = 2 } func g() { print(b) print(a) } func main() { go f() g() }
Dem Dokument zufolge ist es möglich, dass der Code zuerst „2“ und dann „0“ statt ausgibt die erwartete „1“ und „2“. Warum passiert das?
Obwohl Zuweisungen an a und b im Code sequentiell erscheinen, können sie innerhalb der f-Goroutine in der falschen Reihenfolge erfolgen. Da die Goroutine die Variablen nach der Zuweisung nicht verwendet, kann der Compiler sie optimieren, indem er sie neu anordnet.
Die fehlende Synchronisierung zwischen den f- und g-Goroutinen bedeutet jedoch, dass der Compiler zum Zeitpunkt des Druckens keine Konsistenz gewährleistet. Dadurch kann der Wert von b vor dem von a beobachtet werden, wenn beide Zuweisungen in derselben Goroutine erfolgen.
Um die Korrektheit sicherzustellen, ist eine Synchronisierung zwischen Goroutinen erforderlich. Am Synchronisationspunkt garantiert der Compiler, dass beide Zuweisungen abgeschlossen sind. Wenn beispielsweise ein Synchronisationspunkt vor den Druckaufrufen platziert wird, werden die neuen Werte (2 und 1) korrekt gedruckt, wodurch ein falsches Verhalten verhindert wird.
Das obige ist der detaillierte Inhalt vonWarum lässt das Speichermodell von Go unerwartete Ausgaben in gleichzeitigen Goroutinen zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!