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

  1. Iegūst resursu A.
  2. Cenšas iegūt resursu B. Ja tas neizdodas, atbrīvo A un sāk no jauna.

Pavediens 2:

  1. Iegūst resursu B.
  2. 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)
        }
    }
}