Middle+
Co je to livelock?
sobes.tech AI
Odpověď od AI
Livelock je stav podobný deadlocku, ale místo toho, aby vlákna byla zablokována, snaží se neustále vykonávat práci, navzájem ruší své akce kvůli soutěži o zdroje, což vede k jejich neschopnosti postoupit vpřed.
Příklad livelocku: dvě vlákna se snaží získat dva zdroje A a B. Vlákno 1:
- Získá zdroj A.
- Pokusí se získat zdroj B. Pokud se mu to nepodaří, uvolní A a začne znovu.
Vlákno 2:
- Získá zdroj B.
- Pokusí se získat zdroj A. Pokud se mu to nepodaří, uvolní B a začne znovu.
Výsledkem je, že vlákna mohou neustále uvolňovat zdroje a znovu je získávat, aniž by dosáhla cíle.
Rozdíly s deadlockem:
- Deadlock: vlákna jsou zablokována, čekají na sebe navzájem.
- Livelock: vlákna aktivně pracují, ale nepostupují.
Prevence:
- Řádný přístup ke zdrojům.
- Časové limity při pokusu o získání zdroje.
- Vyhýbání se složitým závislostem mezi zdroji.
Příklad pseudokódu s pokusem o livelock:
// Zdroj 1
let resource1 = NSLock()
// Zdroj 2
let resource2 = NSLock()
// Vlákno 1
DispatchQueue.global().async {
while true {
resource1.lock()
if resource2.tryLock() {
// Oba zdroje úspěšně získány
// Vykonání práce
print("Vlákno 1 provádí práci")
resource2.unlock()
resource1.unlock()
break // Ukončení cyklu po úspěchu
} else {
// Nepodařilo se získat resource2, uvolní resource1 a znovu
resource1.unlock()
// Krátká pauza, aby se zabránilo okamžitým opakováním
Thread.sleep(forTimeInterval: 0.01)
}
}
}
// Vlákno 2
DispatchQueue.global().async {
while true {
resource2.lock()
if resource1.tryLock() {
// Oba zdroje úspěšně získány
// Vykonání práce
print("Vlákno 2 provádí práci")
resource1.unlock()
resource2.unlock()
break // Ukončení cyklu po úspěchu
} else {
// Nepodařilo se získat resource1, uvolní resource2 a znovu
resource2.unlock()
// Krátká pauza
Thread.sleep(forTimeInterval: 0.01)
}
}
}