Senior
основен пакет внос ( "fmt" ) функция main() { c := make(chan string) go fmt.Println(<-c) c <- "Здравей свят!" fmt.Println("Изход!") } фатална грешка: всички горутини спят - 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.