Sobes.tech
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álu c.
  • Hlavní goroutine se snaží odeslat hodnotu "Hello World!" do kanálu c.

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.