Senior
glavni paket uvozi ( "fmt" ) funkcija main() { c := make(chan string) goreutina go fmt.Println(<-c) c <- "Zdravo svete!" fmt.Println("Izlaz!") } fatali error: svi gorutini spavaju - deadlock! goroutine 1 [primanje kanala]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Program je završio: status 2.
sobes.tech АИ
Одговор од АИ
Грешка fatal error: all goroutines are asleep - deadlock! се јавља када су све горутине блокиране и ниједна не може да настави.
У овом коду:
c := make(chan string)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
Канал c је креиран без буфера, што значи да операције слања (c <-) и прихватања (<-c) морају бити истовремене.
Објашњење:
- Горутине
go fmt.Println(<-c)покушава да прими вредност из каналаc. - Главна горутина покушава да пошаље вредност
"Hello World!"у каналc.
Међутим, пошто fmt.Println(<-c) ради у посебној горутини, а слање се дешава у главној, може се десити да горутина за читање још није спремна да прими податке, и главна горутина се блокира на слању.
Као резултат, обе горутине се блокирају: једна чека да пошаље, друга да прими, али ниједна не може да настави — настаје deadlock.
Да би се то исправило, може:
- Направити канал са буфером, на пример
c := make(chan string, 1), тако да слање не блокира. - Или променити редослед операција, прво послати, па прочитати.
Пример са буфером:
c := make(chan string, 1)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
Сада ће програм радити без deadlock-а.