Sobes.tech
Middle+

Mi az a livelock?

sobes.tech MI

Válasz az MI-től

Livelock egy olyan állapot, amely hasonló a deadlockhoz, de itt a szálak nem blokkolódnak, hanem folyamatosan próbálkoznak a munkavégzéssel, egymás műveleteit megszakítva a forrásokért folytatott verseny miatt, ami megakadályozza őket abban, hogy előrehaladjanak.

Livelock példája: két szál próbál meg két erőforrást A és B megszerezni. Szál 1:

  1. Megszerzi az A erőforrást.
  2. Megpróbálja megszerezni a B erőforrást. Ha nem sikerül, felszabadítja az A-t és újra próbálkozik.

Szál 2:

  1. Megszerzi a B erőforrást.
  2. Megpróbálja megszerezni az A erőforrást. Ha nem sikerül, felszabadítja a B-t és újra próbálkozik.

Ennek eredményeként a szálak folyamatosan felszabadíthatják az erőforrásokat és újra próbálkozhatnak azok megszerzésével, anélkül, hogy elérnék a célt.

Különbségek a deadlockkal:

  • Deadlock: a szálak blokkolva vannak, egymást várva.
  • Livelock: a szálak aktívan dolgoznak, de nem haladnak előre.

Előzés:

  • Rendezett hozzáférés az erőforrásokhoz.
  • Időkorlát az erőforrás megszerzésének próbálkozásakor.
  • Kerülni a komplex függőségeket az erőforrások között.

Példa pseudokód livelock próbálkozására:

// Erőforrás 1
let resource1 = NSLock()
// Erőforrás 2
let resource2 = NSLock()

// Szál 1
DispatchQueue.global().async {
    while true {
        resource1.lock()
        if resource2.tryLock() {
            // Mindkét erőforrás sikeresen megszerezve
            // Munka végrehajtása
            print("Szál 1 végzi a munkát")
            resource2.unlock()
            resource1.unlock()
            break // A siker után a ciklus befejezése
        } else {
            // Nem sikerült megszerezni a resource2-t, felszabadítja az resource1-t és újra próbálkozik
            resource1.unlock()
            // Rövid szünet, hogy elkerüljük a azonnali ismétlést
            Thread.sleep(forTimeInterval: 0.01)
        }
    }
}

// Szál 2
DispatchQueue.global().async {
    while true {
        resource2.lock()
        if resource1.tryLock() {
            // Mindkét erőforrás sikeresen megszerezve
            // Munka végrehajtása
            print("Szál 2 végzi a munkát")
            resource1.unlock()
            resource2.unlock()
            break // A siker után a ciklus befejezése
        } else {
            // Nem sikerült megszerezni a resource1-t, felszabadítja a resource2-t és újra próbálkozik
            resource2.unlock()
            // Rövid szünet
            Thread.sleep(forTimeInterval: 0.01)
        }
    }
}