Sobes.tech
Middle+

Wat is een livelock?

sobes.tech AI

Antwoord van AI

Livelock is een toestand die vergelijkbaar is met deadlock, maar in plaats van dat threads worden geblokkeerd, proberen ze voortdurend werk uit te voeren, waarbij ze elkaars acties annuleren vanwege concurrentie om resources, wat leidt tot hun onvermogen om vooruitgang te boeken.

Voorbeeld van livelock: twee threads proberen twee resources A en B te verkrijgen. Thread 1:

  1. Krijgt resource A.
  2. Probeert resource B te krijgen. Als dat niet lukt, geeft hij A vrij en begint opnieuw.

Thread 2:

  1. Krijgt resource B.
  2. Probeert resource A te krijgen. Als dat niet lukt, geeft hij B vrij en begint opnieuw.

Als resultaat kunnen de threads constant resources vrijgeven en opnieuw proberen te verkrijgen, zonder een doel te bereiken.

Verschil met deadlock:

  • Deadlock: threads zijn geblokkeerd, wachtend op elkaar.
  • Livelock: threads werken actief, maar maken geen vooruitgang.

Preventie:

  • Geordende toegang tot resources.
  • Time-outs bij het proberen te verkrijgen van een resource.
  • Vermijden van complexe afhankelijkheden tussen resources.

Voorbeeld pseudocode met livelock poging:

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

// Thread 1
DispatchQueue.global().async {
    while true {
        resource1.lock()
        if resource2.tryLock() {
            // Beide resources succesvol verkregen
            // Werk uitvoeren
            print("Thread 1 voert werk uit")
            resource2.unlock()
            resource1.unlock()
            break // Loop beëindigen na succes
        } else {
            // resource2 kon niet worden verkregen, resource1 vrijgeven en opnieuw proberen
            resource1.unlock()
            // Korte pauze om onmiddellijke herhaling te voorkomen
            Thread.sleep(forTimeInterval: 0.01)
        }
    }
}

// Thread 2
DispatchQueue.global().async {
    while true {
        resource2.lock()
        if resource1.tryLock() {
            // Beide resources succesvol verkregen
            // Werk uitvoeren
            print("Thread 2 voert werk uit")
            resource1.unlock()
            resource2.unlock()
            break // Loop beëindigen na succes
        } else {
            // resource1 kon niet worden verkregen, resource2 vrijgeven en opnieuw proberen
            resource2.unlock()
            // Korte pauze
            Thread.sleep(forTimeInterval: 0.01)
        }
    }
}