Sobes.tech
Senior

pachet principal import ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Salut lume!" fmt.Println("Ieșire!") } eroare fatală: toate goroutine-urile sunt adormite - deadlock! goroutine 1 [primire canal]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programul a ieșit: status 2.

sobes.tech AI

Răspuns de la AI

Eroarea fatal error: all goroutines are asleep - deadlock! apare atunci când toate goroutine-urile sunt blocate și niciuna nu poate continua.

În acest cod:

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

Canalul c este creat fără buffer, deci operațiile de trimitere (c <-) și de primire (<-c) trebuie să aibă loc simultan.

Explicație:

  • Goroutine-ul go fmt.Println(<-c) încearcă să primească o valoare din canalul c.
  • Goroutine-ul principal încearcă să trimită valoarea "Hello World!" în canalul c.

Însă, deoarece fmt.Println(<-c) rulează într-o goroutine separată și trimiterea are loc în goroutine-ul principal, poate apărea situația în care goroutine-ul de citire nu este încă gata să primească date, iar goroutine-ul principal se blochează la trimitere.

Ca rezultat, ambele goroutine-uri se blochează: una așteaptă să trimită, cealaltă să primească, dar niciuna nu poate continua — apare un deadlock.

Pentru a remedia, se poate:

  • Face canalul cu buffer, de exemplu c := make(chan string, 1), astfel încât trimiterea să nu se blocheze.
  • Sau schimba ordinea operațiilor, trimițând mai întâi și citind apoi.

Exemplu cu buffer:

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

Acum, programul va rula fără deadlock.