Heim >Backend-Entwicklung >Golang >Warum führt die Übergabe einer WaitGroup-Struktur nach Wert zu einem Deadlock in der Go-Kanal-Kommunikation?

Warum führt die Übergabe einer WaitGroup-Struktur nach Wert zu einem Deadlock in der Go-Kanal-Kommunikation?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-29 07:47:02440Durchsuche

Why Does Passing a WaitGroup Structure by Value Cause a Deadlock in Go Channel Communication?

Deadlock in der Go-Kanal-Kommunikation aufgrund der Übergabe von Struktur nach Wert

In Ihrem Code ist in Ihrem Goroutine-Kanal ein Deadlock-Fehler aufgetreten Kommunikation. Dieser Fehler liegt daran, dass Sie eine WaitGroup-Struktur als Wert an Ihre Goroutinen übergeben, wodurch eine Kopie der WaitGroup erstellt wird, anstatt die ursprüngliche Referenz zu teilen.

Warum die Übergabe eines Werts einen Deadlock verursacht

Strukturen in Go werden als Wert und nicht als Referenz übergeben. Wenn Sie eine Struktur an eine Funktion übergeben, wird eine Kopie erstellt und an die Funktion übergeben. Dies bedeutet, dass alle an der Struktur innerhalb der Funktion vorgenommenen Änderungen nicht in der ursprünglichen Struktur außerhalb der Funktion widergespiegelt werden.

In Ihrem Fall versuchen die Goroutinen, der WaitGroup ein Signal zu senden, wenn sie ihre Aufgaben abgeschlossen haben. Da sie jedoch eine Kopie der WaitGroup verwenden, haben ihre Done()-Aufrufe keinen Einfluss auf die ursprüngliche WaitGroup. Infolgedessen wird der Wait()-Aufruf in der Haupt-Goroutine nie abgeschlossen, was zu einem Deadlock führt.

Lösung: Übergabe des Zeigers

Um dieses Problem zu beheben, müssen Sie Sie müssen die WaitGroup per Zeiger an Ihre Goroutinen übergeben. Dadurch wird sichergestellt, dass sowohl die Goroutinen als auch die Haupt-Goroutine denselben Verweis auf die WaitGroup verwenden.

Arbeitsbeispiel:

Hier ist eine korrigierte Version Ihres Codes:

<code class="go">package main

import (
    "fmt"
    "sync"
)

func push(c chan int, wg *sync.WaitGroup) {
    for i := 0; i < 5; i++ {
        c <- i
    }
    wg.Done()
}

func pull(c chan int, wg *sync.WaitGroup) {
    for i := 0; i < 5; i++ {
        result, ok := <-c
        fmt.Println(result, ok)
    }
    wg.Done()
}

func main() {
    var wg sync.WaitGroup
    wg.Add(2)
    c := make(chan int)

    go push(c, &wg)
    go pull(c, &wg)

    wg.Wait()
}</code>

Wenn Sie diesen Code jetzt ausführen, sollte der Deadlock-Fehler nicht mehr auftreten. Die Goroutinen signalisieren der WaitGroup erfolgreich und die Haupt-Goroutine kann ihre Ausführung abschließen.

Das obige ist der detaillierte Inhalt vonWarum führt die Übergabe einer WaitGroup-Struktur nach Wert zu einem Deadlock in der Go-Kanal-Kommunikation?. 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