Sobes.tech
Junior

Šta je deadlock?

sobes.tech АИ

Одговор од АИ

Deadlock (Deadlock) je stanje u kojem dva ili više niti ili procesa blokiraju jedni druge, čekajući da se oslobodi resurs od strane drugog, kako bi nastavili sa izvršavanjem. Javlja se kada svaka nit poseduje resurs koji je potreban drugoj niti, i čeka da se taj resurs oslobodi.

Četiri uslova potrebna za nastanak deadlock-a (uslovi Coffman):

  1. Međusobno isključivanje (Mutual Exclusion): Resurs ne može biti korišćen istovremeno od više procesa.
  2. Zadržavanje i čekanje (Hold and Wait): Nit koja već poseduje bar jedan resurs, čeka na dodatne resurse koje drže druge niti.
  3. Nema preuzimanja (No Preemption): Resursi ne mogu biti prinudno oduzeti od niti. Mogu biti oslobođeni samo dobrovoljno od strane niti koja ih poseduje.
  4. Cikličko čekanje (Circular Wait): Postoji ciklus čekanja između dve ili više niti. Na primer, nit A čeka resurs koji drži nit B, koja zauzvrat čeka resurs koji drži nit C, koja čeka resurs koji drži nit A.

U razvoju iOS, deadlock-ovi se često javljaju pri radu sa konkurencijom, na primer, pri pogrešnoj upotrebi GCD (Grand Central Dispatch) ili redova operacija:

  • Pokušaj da se sinhrono izvrši blok koda na redu gde već radi trenutni nit (na primer, poziv sync na main redu iz glavnog niti).
  • Dva niti pokušavaju da steknu dva različita zaključavanja ili semafora u različitom redosledu.

Primer jednostavnog deadlock-a koristeći GCD:

func deadlockExample() {
    // Glavni red
    let mainQueue = DispatchQueue.main

    // Sinhrono izvršavanje bloka na glavnom redu iz glavnog niti
    // Glavni nit čeka da blok završi,
    // a blok ne može da se izvrši jer je glavni nit zauzet čekanjem.
    mainQueue.sync {
        print("Ova linija nikada neće biti dostignuta.")
    }
}