Heim >Backend-Entwicklung >Golang >Warum ist der Wert meiner Goroutine für andere nicht sichtbar?

Warum ist der Wert meiner Goroutine für andere nicht sichtbar?

Linda Hamilton
Linda HamiltonOriginal
2024-10-29 11:37:30734Durchsuche

Why Is My Goroutine's Value Not Visible to Others?

Liegt das daran, dass der Go-Compiler den Code optimiert hat?

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!

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