Heim >Backend-Entwicklung >Golang >Warum lässt das Speichermodell von Go unerwartete Ausgaben in gleichzeitigen Goroutinen zu?

Warum lässt das Speichermodell von Go unerwartete Ausgaben in gleichzeitigen Goroutinen zu?

Susan Sarandon
Susan SarandonOriginal
2024-11-25 00:42:10270Durchsuche

Why Does Go's Memory Model Allow Unexpected Output in Concurrent Goroutines?

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!

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