Falsche Synchronisierung in Go Lang
Das Go-Speichermodelldokument erklärt, dass der folgende Code dazu führen kann, dass g 2 und dann druckt 0:
var a, b int
func f() {
a = 1
b = 2
}
func g() {
print(b)
print(a)
}
func main() {
go f()
g()
}
Nach dem Login kopieren
Erklärung:
- Variablen a und b werden auf ihre Nullwerte (0) initialisiert, bevor eine Funktion ausgeführt wird.
- Die Regel „Happens Before“ im Go-Speichermodell ermöglicht es Compilern und Prozessoren, Vorgänge innerhalb einer einzelnen Goroutine neu anzuordnen, wenn die Neuordnung keine Auswirkungen hat sein Verhalten.
- In der f()-Funktion treten die Zuweisungen an a und b möglicherweise nicht in der angegebenen Reihenfolge auf, wenn die Neuordnung in dieser Goroutine keinen Unterschied macht.
- Da die Zuweisungen keinen Einfluss auf die f()-Funktion haben, kann der Compiler sie aus Effizienzgründen neu anordnen.
- Da es keine Synchronisation zwischen den beiden Goroutinen gibt (d. h. f() und g()) im bereitgestellten Beispiel versucht der Compiler nicht, die Konsistenz zwischen ihnen sicherzustellen.
- Wenn Sie jedoch eine Synchronisierung zwischen den Goroutinen einführen, garantiert der Compiler, dass am Synchronisierungspunkt beide Zuweisungen dies tun „abgeschlossen“ sein. Dies bedeutet, dass die korrekten Werte (2 und 1) in g() gedruckt werden.
Das obige ist der detaillierte Inhalt vonWhy Might Go's `go f(); g()` „20' anstelle von „21' ausgeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!