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:
- Resurs A-nı alır.
- Resurs B-ni almağa çalışır. Əgər alınmazsa, A-nı azad edir və yenidən cəhd edir.
İş parçacı 2:
- Resurs B-ni alır.
- 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)
}
}
}