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)
}
}
}