Senior
əsas paket import ( "fmt" ) fun main() { c := make(chan string) go fmt.Println(<-c) c <- "Salam Dünya!" fmt.Println("Çıxış!") } fatal xəta: bütün goroutinlar yuxuya getdi - deadlock! goroutine 1 [kanal qəbul]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Proqram çıxış etdi: vəziyyət 2.
sobes.tech Süni İntellekt
AI-dan cavab
fatal error: all goroutines are asleep - deadlock! xətası, bütün goroutinlar bloklandıqda və heç biri davam edə bilmədikdə baş verir.
Bu kodda:
c := make(chan string)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
Kanal c tampon olmadan yaradılıb, yəni göndərmə (c <-) və qəbul etmə (<-c) əməliyyatları eyni vaxtda baş verməlidir.
İzah:
go fmt.Println(<-c)goroutine-u kanaldan dəyər almağa çalışır.- Əsas goroutine
"Hello World!"dəyərini kanala göndərməyə çalışır.
Lakin, fmt.Println(<-c) ayrı bir goroutine-da işləyir və göndərmə əsas goroutine-də baş verir, bu zaman oxuma goroutine-u hələ hazır olmaya bilər və əsas goroutine göndərmədə bloklanır.
Nəticədə, hər iki goroutine bloklanır: biri göndərməyi gözləyir, digəri isə almağı, amma heç biri davam edə bilmir — deadlock yaranır.
Bunu həll etmək üçün:
- Kanalı tamponlu etmək olar, məsələn,
c := make(chan string, 1), beləliklə göndərmə bloklanmaz. - Və ya əməliyyatların ardıcıllığını dəyişmək, əvvəl göndərmək, sonra oxumaq.
Tamponlu nümunə:
c := make(chan string, 1)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
İndi proqram deadlock olmadan işləyəcək.