Sobes.tech
Senior

asosiy paket import ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Salom Dunyo!" fmt.Println("Chiqish!") } fatal xato: barcha goroutinlar uxlab qolgan - deadlock! goroutine 1 [kanal qabul qilish]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Dastur tugadi: holat 2.

sobes.tech AI

AIdan javob

fatal error: all goroutines are asleep - deadlock! xatosi, barcha goroutinlar bloklangan va hech biri davom etolmaydi, deganda yuzaga keladi.

Ushbu kodda:

c := make(chan string)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")

c kanali bo'sh buffer bilan yaratilgan, shuning uchun yuborish (c <-) va qabul qilish (<-c) operatsiyalari bir vaqtning o'zida bo'lishi kerak.

Tushuntirish:

  • go fmt.Println(<-c) goroutine kanaldan qiymat olishga harakat qilmoqda.
  • Asosiy goroutine "Hello World!" qiymatini kanalga yubormoqda.

Ammo, fmt.Println(<-c) alohida goroutine'da ishlayotgan va yuborish asosiy goroutine'da bo'lib, o'qish goroutine hali tayyor bo'lmasligi mumkin va asosiy goroutine yuborishda bloklanadi.

Natijada, ikkala goroutine ham bloklanadi: biri yuborishni kutmoqda, ikkinchisi olishni, lekin hech biri davom eta olmaydi — deadlock yuzaga keladi.

Buni tuzatish uchun:

  • Kanalni buffer bilan qilish mumkin, masalan, c := make(chan string, 1), shunda yuborish bloklanmaydi.
  • Yoki operatsiyalar tartibini o'zgartirish, avval yuborish, keyin o'qish.

Buffer bilan misol:

c := make(chan string, 1)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")

Endi dastur deadlocksiz ishlaydi.