Junior
Mi az a deadlock?
sobes.tech MI
Válasz az MI-től
Deadlock (Halálzár) olyan állapot, amikor két vagy több szál vagy folyamat blokkolja egymást, várva arra, hogy a másik felszabadítson egy erőforrást a folytatáshoz. Akkor fordul elő, amikor minden szál rendelkezik egy másik szál által szükséges erőforrással, és arra vár, hogy az felszabaduljon.
Négy feltétel szükséges a deadlock kialakulásához (Coffman feltételek):
- Kölcsönös kizárás (Mutual Exclusion): Az erőforrást nem lehet egyszerre több folyamat által használni.
- Tartás és várakozás (Hold and Wait): Egy szál, amely már rendelkezik legalább egy erőforrással, vár más erőforrásokra, amelyeket más szálak tartanak.
- Preemption hiánya (No Preemption): Az erőforrásokat nem lehet erőszakkal elvenni egy szálból. Csak önkéntesen, a szál által, aki birtokolja, adhatók át.
- Körkörös várakozás (Circular Wait): Két vagy több szál között ciklikus várakozás alakul ki. Például, az A szál egy B által tartott erőforrást vár, a B pedig egy C által tartott erőforrást, a C pedig egy A által tartott erőforrást vár.
Az iOS fejlesztésben a deadlockok gyakran fordulnak elő, amikor a concurrency-t rosszul használják, például a GCD (Grand Central Dispatch) vagy az Operation Queues helytelen alkalmazásakor:
- Szinkron módon próbál végrehajtani egy kódrészt egy olyan soron, ahol már fut a jelenlegi szál (például,
synchívása amainsoron a fő szálról). - Két szál próbál két zárolást vagy szemináriumot más sorrendben megszerezni.
Egyszerű deadlock példa GCD használatával:
func deadlockExample() {
// Fő sor
let mainQueue = DispatchQueue.main
// Szinkron végrehajtás egy blokk a fő soron a fő szálról
// A fő szál vár a blokk befejezésére,
// és a blokk nem futhat, mert a fő szál foglalt várakozás közben.
mainQueue.sync {
print("Ez a sor soha nem fog elérni.")
}
}