Heim >Backend-Entwicklung >Golang >Warum führt das Erhöhen einer Variablen durch meine Goroutine zu unerwarteten Ergebnissen?
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++ } }() <p>Die Ausgabe ist jedoch immer 1. Dieses Verhalten kann dem Go-Speichermodell und der spezifischen Implementierung dieses Codes zugeschrieben werden.</p> <h3>Das Go-Speichermodell</h3> <p>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.</p> <h3>Synchronisierung weglassen</h3> <p>Im angegebenen Code:</p> <ul> <li>Die Zuweisung zu i (d. h. i ) Es folgt kein Synchronisierungsereignis, was darauf hinweist, dass Änderungen für andere Goroutinen möglicherweise nicht sofort sichtbar sind.</li> <li>Der Compiler kann diese Schleifenoptimierung optimieren, indem er sie zu einem No-Op vereinfacht.</li> </ul> <h3>Optimierung durch den Compiler</h3> <p>Ein aggressiver Compiler könnte die i-Anweisung löschen und die Goroutine effektiv reduzieren auf:</p> <pre class="brush:php;toolbar:false"><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() } }() <p>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.</p></code>
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!