Sobes.tech
Junior

Deadlock чист?

sobes.tech AI

Ҷавоб аз AI

Deadlock (Мавзуи басти) — ин ҳолатест, ки дар он ду ё бештар аз сӯрохҳо ё равандҳо ба ҳамдигар монеъ мешаванд, интизор мешаванд, ки дигаре озод кардани манбаъро барои идомаи иҷрои кор. Вай вақте рӯй медиҳад, ки ҳар як сӯрох манбаъро дорад, ки ба дигаре ниёз дорад, ва интизор аст, ки он озод шавад.

Ду шарт, ки барои пайдоиши deadlock (шартҳои Coffman):

  1. Маҳдудиятҳои мутақобил (Mutual Exclusion): Манбаъ наметавонад ҳамзамон аз ҷониби чанд раванд истифода шавад.
  2. Держӣ ва интизорӣ (Hold and Wait): Як сӯрох, ки аллакай ҳадди ақал як манбаъро дорад, интизор аст, ки манбаъҳои иловагӣ, ки аз ҷониби дигар сӯрохҳо нигоҳ дошта мешаванд, ба даст орад.
  3. Нест кардани пешакӣ (No Preemption): Манбаъҳо наметавонанд бо маҷбурӣ аз сӯрох гирифта шаванд. Онҳо танҳо бо хоҳиши худ аз ҷониби сӯрохе, ки онҳоро дорад, озод карда мешаванд.
  4. Давомдории даврӣ (Circular Wait): Дар байни ду ё бештар аз сӯрохҳо даврае интизорӣ вуҷуд дорад. Масалан, сӯрох A интизор аст, ки манбаъеро, ки дар дасти сӯрох B аст, ба даст орад, B дар навбати худ интизор аст, ки манбаъеро, ки дар дасти сӯрох C аст, ба даст орад, ва C интизор аст, ки манбаъеро, ки дар дасти сӯрох A аст, ба даст орад.

Дар таҳияи iOS, deadlock-ҳо аксар вақт дар кор бо ҳамзамонӣ рӯй медиҳанд, масалан, дар истифодаи нодуруст аз GCD (Grand Central Dispatch) ё қаторҳои амалҳо:

  • кӯшиш барои иҷрои блоки код дар қаторе, ки аллакай дар он ҳоло раванд қарор дорад (масалан, даъвати sync дар қатор main аз сӯрохии асосӣ).
  • Ду сӯрох кӯшиш мекунанд, ки ду lock ё семафорро дар тартиби гуногун ба даст оранд.

Масалан, намунаи оддӣ аз deadlock бо истифодаи GCD:

func deadlockExample() {
    // Қатор асосӣ
    let mainQueue = DispatchQueue.main

    // Иҷрои синхронӣ дар қатор асосӣ аз сӯрохии асосӣ
    // Сӯрохии асосӣ интизор аст, ки блок ба анҷом расад,
    // ва блок наметавонад иҷро шавад, зеро сӯрохии асосӣ машғул интизорӣ аст.
    mainQueue.sync {
        print("Ин сатр ҳеҷ гоҳ нарасида аст.")
    }
}