Heim >Backend-Entwicklung >Golang >Warum ist der Wert meiner Goroutine für andere nicht sichtbar?
Das Problem ist nicht eine Optimierung durch den Go-Compiler, sondern eher ein Mangel an Synchronisierung. Auf die Zuweisung zu i folgt kein Synchronisationsereignis, daher kann nicht garantiert werden, dass sie von einer anderen Goroutine beobachtet wird. Tatsächlich könnte ein aggressiver Compiler die gesamte i-Anweisung löschen.
Das Go-Speichermodell
Das Go-Speichermodell gibt die Bedingungen an, unter denen eine Variable in einem gelesen wird Es kann garantiert werden, dass Goroutine Werte beobachtet, die durch Schreibvorgänge in dieselbe Variable in einer anderen Goroutine erzeugt werden.
Um den Zugriff zu serialisieren, schützen Sie die Daten mit Kanaloperationen oder anderen Synchronisierungsprimitiven wie z diejenigen in den Paketen sync und sync/atomic.
Wenn Sie den Rest dieses Dokuments lesen müssen, um das Verhalten Ihres Programms zu verstehen, sind Sie zu schlau. Seien Sie nicht schlau.
Synchronisation
Im folgenden Beispiel folgt auf die Zuweisung zu a kein Synchronisationsereignis, daher ist die Einhaltung nicht garantiert von jeder anderen Goroutine. Tatsächlich könnte ein aggressiver Compiler die gesamte go-Anweisung löschen.
<code class="go">var a string func hello() { go func() { a = "hello" }() print(a) }</code>
Das folgende Beispiel zeigt, wie der Zugriff auf i mithilfe eines sync.Mutex serialisiert wird.
<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>
Das obige ist der detaillierte Inhalt vonWarum ist der Wert meiner Goroutine für andere nicht sichtbar?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!