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.