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):
- Excludere mutuală (Mutual Exclusion): Resursa nu poate fi utilizată simultan de mai multe procese.
- 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.
- 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.
- 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
syncpe coadamaindin 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ă.")
}
}