Sobes.tech
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суз иштейт.