Heim >Backend-Entwicklung >Golang >Warum kann die gleichzeitige Ausführung von Go zu unerwarteten Variablenwerten führen?
Das GoLang-Speichermodelldokument besagt, dass der folgende Code dazu führen kann, dass g 2 gefolgt von 0 ausgibt:
var a, b int func f() { a = 1 b = 2 } func g() { print(b) print(a) } func main() { go f() g() }
Dieses Verhalten ergibt sich aus der asynchronen Natur von Go-Routinen. Vor jeder Funktionsausführung werden die Variablen a und b auf ihre jeweiligen Nullwerte (0) initialisiert. Die Funktion f() ändert diese Variablen und die Funktion g() gibt anschließend ihre Werte aus.
Innerhalb einer Goroutine stellt die Sprachspezifikation sicher, dass Lese- und Schreibvorgänge in der vom Programm angegebenen Reihenfolge erfolgen. Allerdings kann eine Neuordnung von Operationen erfolgen, ohne das Verhalten der Goroutine zu beeinflussen, was hier der Fall ist.
In der f()-Goroutine kann der Compiler optimieren, indem er die Zuweisungen an b und a neu anordnet. Da die Goroutine diese Variablen nach der Zuweisung nicht verwendet, hat die Neuordnung keinen Einfluss auf ihr Verhalten.
Die Synchronisierung zwischen Goroutinen erfordert dagegen Konsistenz. An Synchronisationspunkten garantiert der Compiler, dass alle Zuweisungen abgeschlossen sind, und stellt sicher, dass sowohl a als auch b ihre zugewiesenen Werte haben, wenn die g()-Goroutine sie liest. Dies gewährleistet den korrekten Ausdruck der geänderten Werte (2 und 1).
Das obige ist der detaillierte Inhalt vonWarum kann die gleichzeitige Ausführung von Go zu unerwarteten Variablenwerten führen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!