Sobes.tech
Middle+

Livelock nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Livelock, deadlock benzer bir durumdur, ancak burada iş parçacıkları kilitlenmek yerine sürekli olarak çalışmaya çalışır, birbirlerinin hareketlerini iptal ederek kaynaklar için rekabet ederler, bu da ilerlemelerini engeller.

Livelock örneği: iki iş parçacığı iki kaynak A ve B'yi almaya çalışıyor. İş Parçacığı 1:

  1. Kaynak A'yı alır.
  2. Kaynak B'yi almaya çalışır. Başarısız olursa, A'yı serbest bırakır ve yeniden dener.

İş Parçacığı 2:

  1. Kaynak B'yi alır.
  2. Kaynak A'yı almaya çalışır. Başarısız olursa, B'yi serbest bırakır ve yeniden dener.

Sonuç olarak, iş parçacıkları sürekli olarak kaynakları serbest bırakıp tekrar almaya çalışabilir, hedeflerine ulaşmadan.

Deadlock ile farklar:

  • Deadlock: iş parçacıkları birbirlerini bekler ve kilitlenirler.
  • Livelock: iş parçacıkları aktif olarak çalışır, ancak ilerleme kaydetmezler.

Önleme:

  • Kaynaklara sıralı erişim.
  • Kaynak alırken zaman aşımı.
  • Kaynaklar arasındaki karmaşık bağımlılıkların önlenmesi.

Örnek pseudocode ile livelock denemesi:

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

// İş Parçacığı 1
DispatchQueue.global().async {
    while true {
        resource1.lock()
        if resource2.tryLock() {
            // Her iki kaynağı da başarıyla aldık
            // İş yapma
            print("İş Parçacığı 1 işi yapıyor")
            resource2.unlock()
            resource1.unlock()
            break // Başarıyla tamamlandıktan sonra döngüyü kır
        } else {
            // resource2 alınamadı, resource1 serbest bırakılır ve tekrar denenir
            resource1.unlock()
            // Kısa bir duraklama, hemen tekrar denemeyi önlemek için
            Thread.sleep(forTimeInterval: 0.01)
        }
    }
}

// İş Parçacığı 2
DispatchQueue.global().async {
    while true {
        resource2.lock()
        if resource1.tryLock() {
            // Her iki kaynağı da başarıyla aldık
            // İş yapma
            print("İş Parçacığı 2 işi yapıyor")
            resource1.unlock()
            resource2.unlock()
            break // Başarıyla tamamlandıktan sonra döngüyü kır
        } else {
            // resource1 alınamadı, resource2 serbest bırakılır ve tekrar denenir
            resource2.unlock()
            // Kısa bir duraklama
            Thread.sleep(forTimeInterval: 0.01)
        }
    }
}