Sobes.tech
Senior

асосий пакет импорт ( "fmt" ) функция main() { c := make(chan string) go fmt.Println(<-c) c <- "Salom dunyo!" fmt.Println("Chiqish!") } фатал хато: барча горутинлар уйда - deadlock! goroutine 1 [канал қабул қилиш]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Программа чиқди: статус 2.

sobes.tech AI

Ҷавоб аз AI

Ҳатолик 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 кор мекунад.