Sobes.tech
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:

  1. Získá zdroj A.
  2. Pokusí se získat zdroj B. Pokud se mu to nepodaří, uvolní A a začne znovu.

Vlákno 2:

  1. Získá zdroj B.
  2. 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)
        }
    }
}