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álac. - Hlavná goroutine sa snaží odoslať hodnotu
"Hello World!"do kanálac.
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.