Sobes.tech
Senior

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 kanaal c te 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.