Deadlock-Fehler im Go-Kanal
In Go stellen Kanäle ein Kommunikationsmittel zwischen Goroutinen dar. Die unsachgemäße Verwendung von Kanälen kann jedoch zu Deadlocks führen, bei denen Goroutinen auf unbestimmte Zeit blockiert werden.
Eine häufige Ursache für Deadlocks bei Kanälen ist die Übergabe von Werttypen anstelle von Zeigern in Goroutine-Funktionen. Dies liegt daran, dass Go Werttypen nach Wert übergibt, was bedeutet, dass eine Kopie des Werts erstellt wird.
Betrachten Sie dieses Beispiel:
<code class="go">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>
Das Ausführen des Programms führt zu einem Deadlock-Fehler:
0 true 1 true 2 true 3 true 4 true throw: all goroutines are asleep - deadlock!
Der Deadlock tritt auf, weil die WaitGroup als Wert an die Push- und Pull-Funktionen übergeben wird. Wenn die WaitGroup in einer der Goroutinen aktualisiert wird, werden die Änderungen nicht in der anderen Goroutine widergespiegelt, da diese über eine Kopie des Werts verfügt.
Um den Deadlock aufzulösen, müssen wir die WaitGroup als Zeiger übergeben. Dadurch wird sichergestellt, dass beide Goroutinen auf derselben Instanz der WaitGroup ausgeführt werden.
Hier ist die korrigierte Version des Codes:
<code class="go">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>
Das obige ist der detaillierte Inhalt vonWarum führt die Übergabe von Werten anstelle von Zeigern zu einem Deadlock in Go-Kanälen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!