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.