Sobes.tech
Middle+

Mis on livelock?

sobes.tech AI

Vastus AI-lt

Livelock — see on seisund, mis sarnaneb dead-lock-ile, kuid selle asemel, et lukustada, pordid pidevalt püüavad tööd teha, tühistades üksteise tegevused ressursi konkurentsi tõttu, mis viib nende võimetuseni edasi liikuda.

Livelock näide: kaks protsessi püüavad saada kaks ressurssi A ja B. Protsess 1:

  1. Saab ressursi A.
  2. Püüab saada ressursi B. Kui see ei õnnestu, vabastab A ja alustab uuesti.

Protsess 2:

  1. Saab ressursi B.
  2. Püüab saada ressursi A. Kui see ei õnnestu, vabastab B ja alustab uuesti.

Tulemuseks on, et protsessid võivad pidevalt ressursse vabastada ja uuesti proovida, saavutades eesmärgi.

Erinevused dead-lockist:

  • Dead-lock: protsessid on lukustatud, ootavad üksteist.
  • Livelock: protsessid töötavad aktiivselt, kuid ei edene.

Ennetus:

  • Ressurssidele järjekindel juurdepääs.
  • Aegumisaeg ressursi saamise katsel.
  • Keeruliste sõltuvuste vältimine ressursside vahel.

Näide pseudokoodist, mis püüab tekitada livelocki:

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

// Protsess 1
DispatchQueue.global().async {
    while true {
        resource1.lock()
        if resource2.tryLock() {
            // Mõlemad ressursid on edukalt saadud
            // Töö tegemine
            print("Protsess 1 töötab")
            resource2.unlock()
            resource1.unlock()
            break // Tsükli lõpetamine pärast edukat saamist
        } else {
            // Ei õnnestunud saada resource2, vabastame resource1 ja proovime uuesti
            resource1.unlock()
            // Väike paus livelocki vältimiseks
            Thread.sleep(forTimeInterval: 0.01)
        }
    }
}

// Protsess 2
DispatchQueue.global().async {
    while true {
        resource2.lock()
        if resource1.tryLock() {
            // Mõlemad ressursid on edukalt saadud
            // Töö tegemine
            print("Protsess 2 töötab")
            resource1.unlock()
            resource2.unlock()
            break // Tsükli lõpetamine pärast edukat saamist
        } else {
            // Ei õnnestunud saada resource1, vabastame resource2 ja proovime uuesti
            resource2.unlock()
            // Väike paus
            Thread.sleep(forTimeInterval: 0.01)
        }
    }
}