Sobes.tech
Junior

Čo je deadlock?

sobes.tech AI

Odpoveď od AI

Deadlock (zacyklený zámok) je stav, keď dva alebo viac vlákien alebo procesov navzájom blokujú, čakajúc na uvoľnenie zdroja od iného, aby mohli pokračovať vo vykonávaní. Vzniká, keď každé vlákno vlastní zdroj, ktorý potrebuje iné vlákno, a čaká na jeho uvoľnenie.

Štyri podmienky potrebné na vznik deadlocku (podmienky Coffman):

  1. Vzájomná výlučnosť (Mutual Exclusion): Zdroj nemôže byť používaný súčasne viacerými procesmi.
  2. Zadržanie a čakanie (Hold and Wait): Vlákno, ktoré už vlastní aspoň jeden zdroj, čaká na ďalšie zdroje, ktoré držia iné vlákna.
  3. Žiadne prebratie (No Preemption): Zdroje nemôžu byť nútene odobrané vláknu. Môžu byť uvoľnené len dobrovoľne vlákno, ktoré ich vlastní.
  4. Kruhové čakanie (Circular Wait): Existuje cyklus čakania medzi dvoma alebo viacerými vláknami. Napríklad, vlákno A čaká na zdroj, ktorý drží vlákno B, ktoré zase čaká na zdroj, ktorý drží vlákno C, ktoré čaká na zdroj, ktorý drží vlákno A.

V vývoji iOS sa deadlocky často vyskytujú pri práci s konkurenciou, napríklad pri nesprávnom použití GCD (Grand Central Dispatch) alebo front operácií:

  • Pokus o synchronné vykonanie bloku kódu na fronte, na ktorej už beží aktuálne vlákno (napríklad volanie sync na main fronte z hlavného vlákna).
  • Dve vlákna sa snažia získať dva zámky alebo semafory v odlišnom poradí.

Príklad jednoduchého deadlocku s použitím GCD:

func deadlockExample() {
    // Hlavná fronta
    let mainQueue = DispatchQueue.main

    // Synchronné vykonanie bloku na hlavnom fronte z hlavného vlákna
    // Hlavné vlákno čaká na dokončenie bloku,
    // a blok nemôže byť vykonaný, pretože hlavné vlákno je zaneprázdnené čakaním.
    mainQueue.sync {
        print("Táto línia nikdy nebude dosiahnutá.")
    }
}