Sobes.tech
Middle+

Livelock nima?

sobes.tech AI

AIdan javob

Livelock — bu holat, o'xshash dead-lockga, ammo u yerda oqimlar bloklanmaydi, ular doimiy ravishda ishni bajarishga harakat qiladilar, bir-birining harakatlarini bekor qiladilar, resurslar uchun raqobat tufayli, bu ularning oldinga siljishiga olib kelmaydi.

Livelock misoli: ikki oqim A va B resurslarini olishga harakat qilmoqda. Oqim 1:

  1. Resurs A ni oladi.
  2. Resurs B ni olishga harakat qiladi. Agar muvaffaqiyatsiz bo'lsa, A ni bo'shatadi va qayta boshlaydi.

Oqim 2:

  1. Resurs B ni oladi.
  2. Resurs A ni olishga harakat qiladi. Agar muvaffaqiyatsiz bo'lsa, B ni bo'shatadi va qayta boshlaydi.

Natijada, oqimlar doimiy ravishda resurslarni bo'shatib, ularni qayta olishga harakat qiladilar, maqsadga erishmay.

Deadlock bilan farqi:

  • Deadlock: oqimlar bir-birini kutib, bloklanadi.
  • Livelock: oqimlar faol ishlaydi, ammo rivojlanmaydi.

Oldini olish:

  • Resurslarga tartibli kirish.
  • Resursni olishga harakat qilishda vaqt chegarasi.
  • Resurslar o'rtasidagi murakkab bog'liqliklardan qochish.

Livelockga misol pseudokod:

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

// Oqim 1
DispatchQueue.global().async {
    while true {
        resource1.lock()
        if resource2.tryLock() {
            // Ikkala resurs muvaffaqiyatli olindi
            // Ishni bajarish
            print("Oqim 1 ish bajarayapti")
            resource2.unlock()
            resource1.unlock()
            break // Muvaffaqiyatdan so'ng siklni tugatish
        } else {
            // resource2 ni olish muvaffaqiyatsiz, resource1 ni bo'shatish va qayta urinish
            resource1.unlock()
            // Tezkor to'xtash, darhol qayta urinishni oldini olish uchun
            Thread.sleep(forTimeInterval: 0.01)
        }
    }
}

// Oqim 2
DispatchQueue.global().async {
    while true {
        resource2.lock()
        if resource1.tryLock() {
            // Ikkala resurs muvaffaqiyatli olindi
            // Ishni bajarish
            print("Oqim 2 ish bajarayapti")
            resource1.unlock()
            resource2.unlock()
            break // Muvaffaqiyatdan so'ng siklni tugatish
        } else {
            // resource1 ni olish muvaffaqiyatsiz, resource2 ni bo'shatish va qayta urinish
            resource2.unlock()
            // Tezkor to'xtash
            Thread.sleep(forTimeInterval: 0.01)
        }
    }
}