Sobes.tech
Junior — Middle

Çox ipli işləmə zamanı qarşılıqlı bloklama (Deadlock) ilə təcrübəniz olubmu?

sobes.tech Süni İntellekt

AI-dan cavab

Bəli, çox iş parçacıklı proqramlarda qarşılıqlı bloklanma (deadlock) ilə təcrübəm var. Deadlock, iki və ya daha çox iş parçacığının digərinin tutduğu resursların sərbəst buraxılmasını sonsuz gözləməsi halıdır və bu, icranın dayanmasına səbəb olur.

Məsələn, əgər A iş parçacığı 1 resursunu ələ keçirib və 2 resursunu gözləyirsə, və B iş parçacığı 2 resursunu ələ keçirib və 1 resursunu gözləyirsə, qarşılıqlı bloklanma yaranır.

Go-da, bu, mutexlər və ya kanallar düzgün sinxronizasiya edilmədən istifadə olunduqda baş verə bilər. Deadlock-dan qaçınmaq üçün:

  • Resursları həmişə eyni ardıcıllıqla əldə etmək.
  • Timeoutlar və ya ləğv edilə bilən kontekstlərdən istifadə etmək.
  • Bloklama müddətini minimallaşdırmaq.

Potensial deadlock nümunəsi mutexlərlə:

var mu1, mu2 sync.Mutex

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

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

Burada, f1 və f2 eyni zamanda çağırıldıqda, qarşılıqlı bloklanma baş verə bilər.