Heim > Backend-Entwicklung > Golang > Warum gibt mein Go-Parallelitätsbeispiel „6, 6, 6, 6, 6' anstelle der erwarteten Reihenfolge aus?

Warum gibt mein Go-Parallelitätsbeispiel „6, 6, 6, 6, 6' anstelle der erwarteten Reihenfolge aus?

DDD
Freigeben: 2024-11-29 12:26:11
Original
628 Leute haben es durchsucht

Why Does My Go Concurrency Example Print

Go-Parallelität mit for-Schleife und anonymer Funktion: Das Unerwartete aufdecken

Beim Schreiben von gleichzeitigem Code in Go ist es wichtig, das Verhalten anonymer Funktionen zu verstehen. In diesem Beispiel untersuchen wir ein Szenario, in dem eine for-Schleife und eine anonyme Funktion eine unerwartete Ausgabe erzeugen.

Der ursprüngliche Code

func main() {
    var wg sync.WaitGroup

    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go func() {
            fmt.Println(i)
            time.Sleep(time.Second * 1)
            wg.Done()
        }()
    }

    wg.Wait()
}
Nach dem Login kopieren

Das Ausführen dieses Codes gibt überraschenderweise „6, 6, 6, 6, 6“ anstelle der erwarteten Reihenfolge „2, 4, 1, 5, 3“. Dies liegt daran, dass die for-Schleife die Variable i weiterhin aktualisiert, nachdem die Goroutinen gestartet wurden.

Die Abschlüsse

Die anonyme Funktion im obigen Code ist ein Abschluss. Abschlüsse erfassen die Variablen, die zum Zeitpunkt ihrer Erstellung im Hauptteil der Funktion verwendet werden. In diesem Fall wird die Variable i beim Start der Goroutine erfasst. Die Schleife aktualisiert i jedoch weiterhin, nachdem die Goroutine gestartet wurde.

Die Erklärung

Da die Schleife erst endet, wenn i größer als 5 ist, ist i 6, wenn die Goroutinen schließlich ausgeführt werden. Daher gibt jede Goroutine den Wert von i aus, der im Abschluss erfasst wurde, in diesem Fall also 6. Die erwartete Ausgabe wird nur beobachtet, wenn die Variable i als Argument an die anonyme Funktion übergeben wird, wodurch zum Zeitpunkt des Aufrufs effektiv eine Kopie des Werts erstellt wird.

Das obige ist der detaillierte Inhalt vonWarum gibt mein Go-Parallelitätsbeispiel „6, 6, 6, 6, 6' anstelle der erwarteten Reihenfolge aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage