Sobes.tech
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-а.