Senior
hlavní balíček import ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Ahoj světe!" fmt.Println("Výstup!") } fatální chyba: všechny gorutiny jsou spící - deadlock! goroutine 1 [příjem kanálu]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Program ukončen: stav 2.
sobes.tech AI
Odpověď od AI
Chyba fatal error: all goroutines are asleep - deadlock! nastává, když jsou všechny gorutiny zablokované a žádná nemůže pokračovat.
V tomto kódu:
c := make(chan string)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
Kanál c je vytvořen bez bufferu, takže operace odeslání (c <-) a příjmu (<-c) musí probíhat současně.
Vysvětlení:
- Goroutine
go fmt.Println(<-c)se snaží přijmout hodnotu z kanáluc. - Hlavní goroutine se snaží odeslat hodnotu
"Hello World!"do kanáluc.
Nicméně, protože fmt.Println(<-c) běží v samostatné goroutine a odeslání probíhá v hlavní, může dojít k situaci, kdy goroutine pro čtení ještě není připravena přijmout data, a hlavní goroutine se zablokuje na odeslání.
Výsledkem je, že obě gorutiny se zablokují: jedna čeká na odeslání, druhá na přijetí, ale žádná nemůže pokračovat — vzniká deadlock.
Pro opravu lze:
- Udělat kanál s bufferem, například
c := make(chan string, 1), aby odeslání nezpůsobovalo blokaci. - Nebo změnit pořadí operací, nejdříve odeslat, pak číst.
Příklad s bufferem:
c := make(chan string, 1)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
Nyní program poběží bez deadlocku.