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:
- Saab ressursi A.
- Püüab saada ressursi B. Kui see ei õnnestu, vabastab A ja alustab uuesti.
Protsess 2:
- Saab ressursi B.
- 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)
}
}
}