Sobes.tech
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):

  1. Kölcsönös kizárás (Mutual Exclusion): Az erőforrást nem lehet egyszerre több folyamat által használni.
  2. 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.
  3. 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.
  4. 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, sync hívása a main soron 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.")
    }
}