In diesem Codeausschnitt wird eine Goroutine gestartet und erhöht wiederholt die Variable i:
<code class="go">package main import "time" func main() { i := 1 go func() { for { i++ } }() <-time.After(1 * time.Second) println(i) }</code>
Die Ausgabe ist jedoch immer 1. Dieses Verhalten kann dem Go-Speichermodell und der spezifischen Implementierung dieses Codes zugeschrieben werden.
Das Go-Speichermodell definiert die Bedingungen Dadurch kann garantiert werden, dass beim Lesen einer Variablen in einer Goroutine Werte beobachtet werden, die durch Schreibvorgänge in dieselbe Variable in einer anderen Goroutine erzeugt werden. Es betont die Bedeutung der Synchronisierung für den gleichzeitigen Zugriff auf gemeinsam genutzte Daten.
Im angegebenen Code:
Ein aggressiver Compiler könnte die i-Anweisung löschen und die Goroutine effektiv reduzieren auf:
<code class="go">for {}</code>
Um zu zeigen, dass das Problem auf die Ursache zurückzuführen ist Betrachten Sie aufgrund der fehlenden Synchronisierung den folgenden Code:
<code class="go">package main import ( "sync" "time" ) func main() { mx := new(sync.Mutex) i := 1 go func() { for { mx.Lock() i++ mx.Unlock() } }() <-time.After(1 * time.Second) mx.Lock() println(i) mx.Unlock() }</code>
In diesem Fall ist die Ausgabe nicht mehr 1, sondern wie erwartet eine große Zahl. Der sync.Mutex sorgt für Synchronisierung und stellt sicher, dass beide Goroutinen auf kontrollierte Weise auf i zugreifen, wodurch die Goroutine i inkrementieren kann und die Änderungen für die Hauptroutine sichtbar werden.
Das obige ist der detaillierte Inhalt vonWarum führt das Erhöhen einer Variablen durch meine Goroutine zu unerwarteten Ergebnissen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!