Sobes.tech
Senior

pagrindinis paketas importuoti ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Labas pasauli!" fmt.Println("Išeiti!") } mirtina klaida: visi gorutinai miega - deadlock! goroutine 1 [kanalo priėmimas]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programa baigėsi: būklė 2.

sobes.tech AI

Atsakymas iš AI

fatal error: all goroutines are asleep - deadlock! klaida įvyksta, kai visos gorutinos yra užblokuotos ir nė viena negali tęsti.

Šiame kode:

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

Kanalas c sukurtas be buferio, todėl siuntimo (c <-) ir gavimo (<-c) operacijos turi vykti vienu metu.

Paaiškinimas:

  • Gorutina go fmt.Println(<-c) bando gauti reikšmę iš kanalo c.
  • Pagrindinė gorutina bando siųsti reikšmę "Hello World!" į kanalą c.

Tačiau, kadangi fmt.Println(<-c) veikia atskiroje gorutinoje, o siuntimas vyksta pagrindinėje, gali būti, kad skaitymo gorutina dar nėra pasiruošusi priimti duomenis, ir pagrindinė gorutina užstringa siuntimo metu.

Dėl to abi gorutinos užstringa: viena laukia siuntimo, kita — priėmimo, bet nė viena negali tęsti — įvyksta deadlock.

Sprendimui:

  • Padarykite kanalą su buferiu, pvz., c := make(chan string, 1), kad siuntimas nebūtų užstringantis.
  • Arba pakeiskite operacijų tvarką, siųskite pirmiausia, tada skaitykite.

Pavyzdys su buferiu:

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

Dabar programa veiks be deadlocko.