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)горутинасында каналдан маанини алуу аракет кылууда.- Башкы горутина
"Hello World!"маанисин каналга жиберүүгө аракет кылууда.
Бирок, 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суз иштейт.