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š kanaloc. - 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.