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 canalulc. - Goroutine-ul principal încearcă să trimită valoarea
"Hello World!"în canalulc.
Î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.