Sobes.tech
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.