Deadlocks im gleichzeitigen Go verstehen: Ungepufferter Kanal innerhalb einer Goroutine
Im Parallelitätsmodell von Go sind Kanäle ein entscheidendes Werkzeug für die Kommunikation zwischen Goroutinen. Eine unsachgemäße Verwendung von Kanälen kann jedoch zu Deadlocks führen, wie in diesem Codeausschnitt dargestellt:
package main import "fmt" func main() { c := make(chan int) c <- 1 fmt.Println(<-c) }
Bei der Ausführung führt dieser Code zu einem Deadlock mit der folgenden Fehlermeldung:
fatal error: all goroutines are asleep - deadlock!
Warum tritt dieser Deadlock auf?
Das Problem liegt in der Verwendung eines ungepufferten Kanals innerhalb desselben Goroutine. Ungepufferte Kanäle haben keinen internen Speicher, was bedeutet, dass das Senden eines Werts an einen ungepufferten Kanal blockiert, bis eine andere Goroutine den Wert liest.
In diesem Fall sendet die Goroutine einen Wert an Kanal c und versucht, einen Wert von zu empfangen denselben Kanal nacheinander abspielen. Da es keine andere Goroutine gibt, die den Wert empfängt, bleibt die Sender-Goroutine auf unbestimmte Zeit hängen, was zu einem Deadlock führt.
Wie können Sie das Problem beheben?
Es gibt zwei Lösungen :
c := make(chan int, 1)
Dadurch wird ein Kanal mit einer Puffergröße von 1 erstellt, sodass ein Wert ohne Blockierung gespeichert werden kann.
package main import "fmt" func main() { c := make(chan int) go func() { c <- 1 }() fmt.Println(<-c) }
In diesem Beispiel sendet die Sender-Goroutine asynchron einen Wert an Kanal c. Die Haupt-Goroutine empfängt dann den Wert vom Kanal, ohne dass es zu einem Deadlock kommt.
Das Verständnis des Verhaltens ungepufferter Kanäle und die Vermeidung unsachgemäßer Verwendung ist entscheidend für das Schreiben effizienter und nicht blockierender gleichzeitiger Go-Programme.
Das obige ist der detaillierte Inhalt vonWarum führt das Senden und Empfangen auf einem ungepufferten Kanal in derselben Goroutine zu einem Deadlock in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!