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