Middle+
Kas ir livelock?
sobes.tech AI
Atbilde no AI
Livelock — tas stāvoklis ir līdzīgs dead-lock, bet vietā bloķēšanas, pavedieni pastāvīgi cenšas veikt darbu, atceļot viens otra darbības konkurences dēļ, kas noved pie to nespējas virzīties uz priekšu.
Livelock piemērs: divi pavedieni cenšas iegūt divus resursus A un B. Pavediens 1:
- Iegūst resursu A.
- Cenšas iegūt resursu B. Ja tas neizdodas, atbrīvo A un sāk no jauna.
Pavediens 2:
- Iegūst resursu B.
- Cenšas iegūt resursu A. Ja tas neizdodas, atbrīvo B un sāk no jauna.
Rezultātā pavedieni var pastāvīgi atbrīvot resursus un mēģināt tos vēlreiz, nesasniedzot mērķi.
Atšķirības no dead-lock:
- Dead-lock: pavedieni ir bloķēti, gaida viens otru.
- Livelock: pavedieni aktīvi strādā, bet neprogressē.
Profilakse:
- Resursu piekļuves kārtība.
- Laika ierobežojumi mēģinājumam iegūt resursu.
- Sarežģītu atkarību starp resursiem izvairīšanās.
Piemērs pseido-kodā ar mēģinājumu radīt livelock:
// Resurss 1
let resource1 = NSLock()
// Resurss 2
let resource2 = NSLock()
// Pavediens 1
DispatchQueue.global().async {
while true {
resource1.lock()
if resource2.tryLock() {
// Veiksmīgi iegūti abi resursi
// Darba veikšana
print("Pavediens 1 veic darbu")
resource2.unlock()
resource1.unlock()
break // Beigt ciklu pēc veiksmīgas iegūšanas
} else {
// Neizdevās iegūt resource2, atbrīvo resource1 un mēģini vēlreiz
resource1.unlock()
// Neliela pauze, lai izvairītos no livelock
Thread.sleep(forTimeInterval: 0.01)
}
}
}
// Pavediens 2
DispatchQueue.global().async {
while true {
resource2.lock()
if resource1.tryLock() {
// Veiksmīgi iegūti abi resursi
// Darba veikšana
print("Pavediens 2 veic darbu")
resource1.unlock()
resource2.unlock()
break // Beigt ciklu pēc veiksmīgas iegūšanas
} else {
// Neizdevās iegūt resource1, atbrīvo resource2 un mēģini vēlreiz
resource2.unlock()
// Neliela pauze
Thread.sleep(forTimeInterval: 0.01)
}
}
}