Sobes.tech
Junior — Middle

Çox ipli sistemlər hazırlayarkən qarşılaşdığınız qarşılıqlı bloklama problemləri olubmu?

sobes.tech Süni İntellekt

AI-dan cavab

Bəli, çox ipli sistemlər hazırlayarkən, mən qarşılaşdığım problemlərdən biri deadlock (ölüm kilidi) idi. Bu, iki və ya daha çox ipin bir-birini sonsuz müddətə bloklamasıdır; resursların azad olunmasını gözləyirlər və bu resurslar bir-biri tərəfindən tutulur.

Deadlock-ları qarşısını almaq üçün aşağıdakı praktikalardan istifadə edirəm:

  • Həmişə bir neçə kilidi eyni ardıcıllıqla əldə etmək.
  • Kilidlərin saxlanma müddətini minimallaşdırmaq.
  • Kilidləri əldə etməyə çalışarkən zaman aşımı istifadə etmək.
  • Go-da kanallar kimi daha yüksək səviyyəli sinxronizasiya primitivlərindən istifadə etmək.

Go-da sadə deadlock nümunəsi:

var mu1, mu2 sync.Mutex

func f1() {
    mu1.Lock()
    defer mu1.Unlock()
    time.Sleep(time.Second)
    mu2.Lock()
    defer mu2.Unlock()
}

func f2() {
    mu2.Lock()
    defer mu2.Unlock()
    time.Sleep(time.Second)
    mu1.Lock()
    defer mu1.Unlock()
}

Burada, f1 və f2 bir-birini bloklaya bilər, əgər hər ikisi ilk mutex-i əldə edərsə və ikinciyi gözləyərsə. Bu vəziyyətdən qaçınmaq üçün, mutexlərin əldə olunma ardıcıllığını koordinasiya etmək lazımdır.