Junior
Co je to deadlock?
sobes.tech AI
Odpověď od AI
Deadlock (zacyklení zámek) je stav, kdy dva nebo více vláken nebo procesů se navzájem blokují, čekajíce na uvolnění zdroje, aby mohly pokračovat v provádění. Vzniká, když každý vlákno vlastní zdroj, který potřebuje jiné vlákno, a čeká na jeho uvolnění.
Čtyři podmínky nutné pro vznik deadlocku (podmínky Coffman):
- Vzájemné vyloučení (Mutual Exclusion): Zdroj nemůže být používán současně více procesy.
- Držení a čekání (Hold and Wait): Vlákno, které již vlastní alespoň jeden zdroj, čeká na další zdroje, které jsou drženy jinými vlákny.
- Žádné předběhnutí (No Preemption): Zdroje nelze vynuceně odebrat vláknu. Mohou být uvolněny pouze dobrovolně vláknem, které je vlastní.
- Kruhové čekání (Circular Wait): Existuje cyklus čekání mezi dvěma nebo více vlákny. Například, vlákno A čeká na zdroj, který drží vlákno B, které naopak čeká na zdroj, který drží vlákno C, které čeká na zdroj, který drží vlákno A.
V vývoji iOS se deadlocky často vyskytují při práci s konkurencí, například při nesprávném použití GCD (Grand Central Dispatch) nebo front operací:
- Pokus o synchronní provedení bloku kódu na frontě, na které již běží aktuální vlákno (například volání
syncnamainfrontě z hlavního vlákna). - Dvě vlákna se snaží získat dva zámky nebo semafory v odlišném pořadí.
Příklad jednoduchého deadlocku s použitím GCD:
func deadlockExample() {
// Hlavní fronta
let mainQueue = DispatchQueue.main
// Synchronní provedení bloku na hlavní frontě z hlavního vlákna
// Hlavní vlákno čeká na dokončení bloku,
// a blok nemůže být spuštěn, protože hlavní vlákno je zaneprázdněno čekáním.
mainQueue.sync {
print("Tento řádek se nikdy nedostane.")
}
}