Middle+
Livelock чист?
sobes.tech AI
Ҷавоб аз AI
Livelock — ин ҳолат аст, ки монанд ба dead-lock, аммо ба ҷои бастан, равандҳо ҳамеша кӯшиш мекунанд, ки корро иҷро кунанд, бо бекор кардани амалҳо якдигар бо сабаби рақобат барои захираҳо, ки ба нокомии пешрафт оварда мерасонад.
Масалан, livelock: ду раванд кӯшиш мекунанд, ки ду захира A ва B-ро ба даст оранд. Раванд 1:
- Захира A-ро мегирад.
- кӯшиш мекунад, ки захира B-ро ба даст орад. Агар натавонад, A-ро озод мекунад ва аз нав оғоз мекунад.
Раванд 2:
- Захира B-ро мегирад.
- кӯшиш мекунад, ки захира 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)
}
}
}