main pakket importeer ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Hallo Welt!" fmt.Println("Ausgang!") } fatale fout: alle goroutines slapen - deadlock! goroutine 1 [kanaal ontvangen]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programma geëindigd: status 2.
sobes.tech AI
Antwoord van AI
De fout fatal error: all goroutines are asleep - deadlock! treedt op wanneer alle goroutines geblokkeerd zijn en geen enkele verder kan gaan.
In deze code:
c := make(chan string)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
Wordt het kanaal c zonder buffer gemaakt, dus de verzend- (c <-) en ontvang- (<-c) operaties moeten gelijktijdig plaatsvinden.
Uitleg:
- De goroutine
go fmt.Println(<-c)probeert een waarde uit het kanaalcte ontvangen. - De hoofd-goroutine probeert de waarde
"Hello World!"naar het kanaal te sturen.
Omdat fmt.Println(<-c) in een aparte goroutine wordt uitgevoerd en de verzending in de hoofd-goroutine plaatsvindt, kan het gebeuren dat de lees-goroutine nog niet klaar is om data te ontvangen, en de hoofd-goroutine blokkeert bij het verzenden.
Als gevolg hiervan blokkeren beide goroutines: de ene wacht op verzending, de andere op ontvangst, maar geen van beiden kan verder gaan — er ontstaat een deadlock.
Om dit op te lossen, kan je:
- Het kanaal bufferen, bijvoorbeeld
c := make(chan string, 1), zodat de verzending niet blokkeert. - Of de volgorde van de operaties aanpassen, eerst verzenden, dan lezen.
Voorbeeld met buffer:
c := make(chan string, 1)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
Nu zal het programma zonder deadlock werken.