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()
            // Локтун алдын алуу үчүн кичинекей күтүү
            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)
        }
    }
}