Sobes.tech
Junior

Ce este un deadlock?

sobes.tech AI

Răspuns de la AI

Blocarea (Deadlock) este o stare în care două sau mai multe fire de execuție sau procese se blochează reciproc, așteptând ca celălalt să elibereze o resursă pentru a continua execuția. Apare atunci când fiecare fir de execuție deține o resursă de care are nevoie altul și așteaptă eliberarea acesteia.

Patru condiții necesare pentru apariția deadlock-ului (condițiile Coffman):

  1. Excludere mutuală (Mutual Exclusion): Resursa nu poate fi utilizată simultan de mai multe procese.
  2. Păstrare și așteptare (Hold and Wait): Un fir de execuție care deține deja cel puțin o resursă așteaptă să obțină resurse suplimentare, deținute de alți fire.
  3. Fără preemțiune (No Preemption): Resursele nu pot fi luate cu forța de la un fir de execuție. Pot fi eliberate doar voluntar de către firul care le deține.
  4. Așteptare circulară (Circular Wait): Există un ciclu de așteptări între două sau mai multe fire. De exemplu, firul A așteaptă o resursă deținută de firul B, care la rândul său așteaptă o resursă deținută de firul C, care așteaptă o resursă deținută de firul A.

În dezvoltarea iOS, deadlock-urile apar frecvent în lucrul cu concurența, de exemplu, la utilizarea incorectă a GCD (Grand Central Dispatch) sau a cozii de operații:

  • Încercarea de a executa sincron un bloc de cod pe o coadă în care deja se află firul curent (de exemplu, apelarea sync pe coada main din firul principal).
  • Două fire încearcă să obțină două lock-uri sau semafoare în ordine diferită.

Exemplu simplu de deadlock folosind GCD:

func deadlockExample() {
    // Coada principală
    let mainQueue = DispatchQueue.main

    // Executarea sincron a unui bloc pe coada principală din firul principal
    // Firul principal așteaptă finalizarea blocului,
    // iar blocul nu poate fi executat deoarece firul principal este ocupat cu așteptarea.
    mainQueue.sync {
        print("Această linie nu va fi niciodată atinsă.")
    }
}