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