Sobes.tech
Middle+

Livelock чист?

sobes.tech AI

Ҷавоб аз AI

Livelock — ин ҳолат аст, ки монанд ба dead-lock, аммо ба ҷои бастан, равандҳо ҳамеша кӯшиш мекунанд, ки корро иҷро кунанд, бо бекор кардани амалҳо якдигар бо сабаби рақобат барои захираҳо, ки ба нокомии пешрафт оварда мерасонад.

Масалан, livelock: ду раванд кӯшиш мекунанд, ки ду захира A ва B-ро ба даст оранд. Раванд 1:

  1. Захира A-ро мегирад.
  2. кӯшиш мекунад, ки захира B-ро ба даст орад. Агар натавонад, A-ро озод мекунад ва аз нав оғоз мекунад.

Раванд 2:

  1. Захира B-ро мегирад.
  2. кӯшиш мекунад, ки захира A-ро ба даст орад. Агар натавонад, B-ро озод мекунад ва аз нав оғоз мекунад.

Натиҷа: равандҳо метавонанд ҳамеша захираҳоро озод кунанд ва кӯшиш кунанд, ки онҳоро дубора ба даст оранд, бе расидан ба ҳадаф.

Фарқият бо dead-lock:

  • Dead-lock: равандҳо баста шудаанд, интизорӣ мекунанд, ки дигаронро.
  • Livelock: равандҳо фаъолона кор мекунанд, аммо пешрафт намекунанд.

Пешгирӣ:

  • Дастрасии мураттаб ба захираҳо.
  • Вақтҳои интизорӣ дар кӯшиши гирифтани захира.
  • Ҳал кардани вобастагиҳои мураккаб байни захираҳо.

Масалан, коди псевдо бо кӯшиши livelock:

// Захира 1
let resource1 = NSLock()
// Захира 2
let resource2 = NSLock()

// Раванд 1
DispatchQueue.global().async {
    while true {
        resource1.lock()
        if resource2.tryLock() {
            // Ҳосил шудан ба ҳар ду захира
            // Иҷрои кор
            print("Раванд 1 кор мекунад")
            resource2.unlock()
            resource1.unlock()
            break // Боздошти цикл пас аз гирифтани муваффақ
        } else {
            // Натавонистем, resource2-ро ба даст орем, resource1-ро озод мекунем ва дубора кӯшиш мекунем
            resource1.unlock()
            // Каме таъхир барои пешгирии livelock
            Thread.sleep(forTimeInterval: 0.01)
        }
    }
}

// Раванд 2
DispatchQueue.global().async {
    while true {
        resource2.lock()
        if resource1.tryLock() {
            // Ҳосил шудан ба ҳар ду захира
            // Иҷрои кор
            print("Раванд 2 кор мекунад")
            resource1.unlock()
            resource2.unlock()
            break // Боздошти цикл пас аз гирифтани муваффақ
        } else {
            // Натавонистем, resource1-ро ба даст орем, resource2-ро озод мекунем ва дубора кӯшиш мекунем
            resource2.unlock()
            // Каме таъхир
            Thread.sleep(forTimeInterval: 0.01)
        }
    }
}