Sobes.tech
Senior

galvenais pakets importēt ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Sveika, pasaule!" fmt.Println("Išeiti!") } mirtina klaida: visi gorutinai miega - deadlock! goroutine 1 [kanāla saņemšana]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programma beidzās: stāvoklis 2.

sobes.tech AI

Atbilde no AI

fatal error: all goroutines are asleep - deadlock! kļūda rodas, kad visas gorutīnas ir bloķētas un neviena nevar turpināt.

Šajā kodā:

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

Kanāls c ir izveidots bez bufera, tāpēc sūtīšanas (c <-) un saņemšanas (<-c) operācijām jānotiek vienlaikus.

Skaidrojums:

  • Gorutīna go fmt.Println(<-c) mēģina saņemt vērtību no kanāla c.
  • Galvenā gorutīna mēģina nosūtīt vērtību "Hello World!" uz kanāla c.

Tomēr, tā kā fmt.Println(<-c) darbojas atsevišķā gorutīnā, un sūtīšana notiek galvenajā gorutīnā, var rasties situācija, kad saņemšanas gorutīna vēl nav gatava saņemt datus, un galvenā gorutīna bloķējas uz sūtīšanas.

Rezultātā abas gorutīnas bloķējas: viena gaida sūtīšanu, otra — saņemšanu, bet neviena nevar turpināt — rodas deadlock.

Lai to novērstu, var:

  • Izmantot buferētu kanālu, piemēram, c := make(chan string, 1), lai sūtīšana nenobloķētos.
  • Vai mainīt operāciju secību, vispirms sūtot, tad lasot.

Piemērs ar buferi:

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

Tagad programma darbosies bez deadlock.