Sobes.tech
Junior

Deadlock nima?

sobes.tech AI

AIdan javob

Deadlock (Oʻzaro boʻlish) — bu holat bo‘lib, unda ikki yoki undan ortiq oqimlar yoki jarayonlar bir-birini kutib, bloklanadi. Bu, har bir oqim boshqa oqimga kerak bo‘lgan resursga egalik qilgan va bu resursni bo‘shatishni kutayotgan paytda yuzaga keladi.

Deadlock (Coffman shartlari) yuzaga kelishi uchun to‘rt shart:

  1. O‘zaro chiqarish (Mutual Exclusion): Resurs bir vaqtning o‘zida bir nechta jarayon tomonidan ishlatilmasligi kerak.
  2. Ushlab turish va kutish (Hold and Wait): Allaqachon kamida bitta resursga ega bo‘lgan oqim, boshqa oqimlar tomonidan egallangan qo‘shimcha resurslarni olish uchun kutadi.
  3. Preemption yo‘q (No Preemption): Resurslar majburlab olib tashlanishi mumkin emas. Ular faqat resursni egallagan oqim tomonidan ixtiyoriy ravishda bo‘shatilishi mumkin.
  4. Aylana kutish (Circular Wait): Ikki yoki undan ortiq oqimlar o‘rtasida siklik kutish mavjud. Masalan, A oqimi B tomonidan egallangan resursni kutadi, B esa C tomonidan egallangan resursni kutadi, C esa A tomonidan egallangan resursni kutadi.

iOS dasturlashda deadlocklar ko‘pincha, GCD (Grand Central Dispatch) yoki Operation Queues bilan noto‘g‘ri ishlash natijasida yuzaga keladi:

  • Hozirda mavjud bo‘lgan oqimda kod blokini sinxron tarzda bajarishga urinish (masalan, sync chaqiruvi main navbatida asosiy oqimdan).
  • Ikki oqim, ikki turli lock yoki semaforni turli tartibda egallashga harakat qiladi.

GCD yordamida oddiy deadlock misoli:

func deadlockExample() {
    // Asosiy navbat
    let mainQueue = DispatchQueue.main

    // Asosiy oqimdan, asosiy navbatda sinxron blokni bajarish
    // Asosiy oqim, blok tugashini kutadi,
    // va blok, chunki asosiy oqim band, bajarilmaydi.
    mainQueue.sync {
        print("Bu satr hech qachon bajarilmaydi.")
    }
}