Heim >Backend-Entwicklung >Golang >Why Might Go's `go f(); g()` „20' anstelle von „21' ausgeben?

Why Might Go's `go f(); g()` „20' anstelle von „21' ausgeben?

DDD
DDDOriginal
2024-11-23 15:00:17779Durchsuche

Why Might Go's `go f(); g()` Print

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()
}

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn