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
Freigeben: 2024-11-23 15:00:17
Original
772 Leute haben es durchsucht

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

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage