Sobes.tech
Middle+

Livelock nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Livelock — bu dead-locka bənzər vəziyyətdir, lakin burada iş parçaları bloklanmır, əksinə, onlar daim işləməyə çalışır, bir-birlərinin hərəkətlərini ləğv edirlər, resurslar üçün rəqabət səbəbindən, bu da onların irəliləyişinə mane olur.

Livelock nümunəsi: iki iş parçacı A və B resurslarını almağa çalışır. İş parçacı 1:

  1. Resurs A-nı alır.
  2. Resurs B-ni almağa çalışır. Əgər alınmazsa, A-nı azad edir və yenidən cəhd edir.

İş parçacı 2:

  1. Resurs B-ni alır.
  2. Resurs A-nı almağa çalışır. Əgər alınmazsa, B-ni azad edir və yenidən cəhd edir.

Nəticədə, iş parçacıları davamlı olaraq resursları azad edib yenidən almağa çalışa bilər, məqsədə çatmadan.

Deadlock ilə fərqi:

  • Deadlock: iş parçacıları bir-birini gözləyir və bloklanır.
  • Livelock: iş parçacıları aktiv işləyir, amma irəliləmir.

Qarşısını alma:

  • Resurslara ardıcıl giriş.
  • Resursu almağa cəhd zamanı vaxt limiti.
  • Resurslar arasındakı mürəkkəb asılılıqlardan qaçın.

Livelock cəhdinin pseudokodu nümunəsi:

// Resurs 1
let resource1 = NSLock()
// Resurs 2
let resource2 = NSLock()

// İş parçacı 1
DispatchQueue.global().async {
    while true {
        resource1.lock()
        if resource2.tryLock() {
            // Hər iki resurs uğurla alındı
            // İş yerinə yetirilir
            print("İş parçacı 1 iş yerinə yetirir")
            resource2.unlock()
            resource1.unlock()
            break // Uğurdan sonra dövrü bitir
        } else {
            // resource2 alınmadı, resource1 azad edilir və yenidən cəhd edilir
            resource1.unlock()
            // Qısa fasilə, dərhal yenidən cəhdin qarşısını almaq üçün
            Thread.sleep(forTimeInterval: 0.01)
        }
    }
}

// İş parçacı 2
DispatchQueue.global().async {
    while true {
        resource2.lock()
        if resource1.tryLock() {
            // Hər iki resurs uğurla alındı
            // İş yerinə yetirilir
            print("İş parçacı 2 iş yerinə yetirir")
            resource1.unlock()
            resource2.unlock()
            break // Uğurdan sonra dövrü bitir
        } else {
            // resource1 alınmadı, resource2 azad edilir və yenidən cəhd edilir
            resource2.unlock()
            // Qısa fasilə
            Thread.sleep(forTimeInterval: 0.01)
        }
    }
}