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:
- Krijgt resource A.
- Probeert resource B te krijgen. Als dat niet lukt, geeft hij A vrij en begint opnieuw.
Thread 2:
- Krijgt resource B.
- 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)
}
}
}