Sobes.tech
Senior

hlavný balík import ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Ahoj svet!" fmt.Println("Výstup!") } fatálna chyba: všetky gorutiny spia - deadlock! goroutine 1 [prijímanie kanála]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Program ukončený: stav 2.

sobes.tech AI

Odpoveď od AI

Chyba fatal error: all goroutines are asleep - deadlock! nastáva, keď sú všetky gorutiny zablokované a žiadna nemôže pokračovať.

V tomto kóde:

c := make(chan string)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")

Kanál c je vytvorený bez bufferu, takže operácie odoslania (c <-) a prijatia (<-c) musia prebiehať súčasne.

Vysvetlenie:

  • Goroutine go fmt.Println(<-c) sa snaží prijať hodnotu z kanála c.
  • Hlavná goroutine sa snaží odoslať hodnotu "Hello World!" do kanála c.

Avšak, pretože fmt.Println(<-c) beží v samostatnej goroutine a odoslanie sa deje v hlavnej, môže sa stať, že goroutine na čítanie ešte nie je pripravená prijať dáta, a hlavná goroutine sa zablokuje na odoslaní.

Výsledkom je, že obe gorutiny sa zablokujú: jedna čaká na odoslanie, druhá na prijatie, ale žiadna nemôže pokračovať — vzniká deadlock.

Na opravu je možné:

  • Urobiť kanál s bufferom, napríklad c := make(chan string, 1), aby odoslanie neblokovalo.
  • Alebo zmeniť poradie operácií, najskôr odoslať, potom čítať.

Príklad s bufferom:

c := make(chan string, 1)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")

Teraz program bude fungovať bez deadlocku.