Sobes.tech
Junior

Cos'è un deadlock?

sobes.tech AI

Risposta dell'AI

Deadlock (Deadlock) è uno stato in cui due o più thread o processi si bloccano a vicenda, aspettando che l'altro rilasci una risorsa per continuare l'esecuzione. Si verifica quando ogni thread possiede una risorsa di cui ha bisogno un altro thread, e aspetta che questa risorsa venga liberata.

Quattro condizioni necessarie affinché si verifichi un deadlock (condizioni di Coffman):

  1. Esclusione mutua (Mutual Exclusion): La risorsa non può essere utilizzata contemporaneamente da più processi.
  2. Ritenzione e attesa (Hold and Wait): Un thread che possiede già almeno una risorsa aspetta di acquisire risorse aggiuntive che sono detenute da altri thread.
  3. Nessuna preemption (No Preemption): Le risorse non possono essere forzatamente sottratte a un thread. Possono essere rilasciate volontariamente dal thread che le possiede.
  4. Attesa circolare (Circular Wait): Esiste un ciclo di attese tra due o più thread. Ad esempio, il Thread A aspetta una risorsa detenuta dal Thread B, che a sua volta aspetta una risorsa detenuta dal Thread C, che aspetta una risorsa detenuta dal Thread A.

Nello sviluppo iOS, i deadlock si verificano spesso durante l'uso della concorrenza, ad esempio, quando si utilizza in modo errato GCD (Grand Central Dispatch) o le code di operazioni:

  • Tentare di eseguire in modo sincrono un blocco di codice su una coda in cui si trova già il thread corrente (ad esempio, chiamare sync sulla coda main dal thread principale).
  • Due thread cercano di acquisire due lock o semafori in ordine diverso.

Esempio semplice di deadlock usando GCD:

func deadlockExample() {
    // Coda principale
    let mainQueue = DispatchQueue.main

    // Eseguire in modo sincrono un blocco sulla coda principale dal thread principale
    // Il thread principale aspetta che il blocco finisca,
    // e il blocco non può essere eseguito perché il thread principale è occupato ad aspettare.
    mainQueue.sync {
        print("Questa riga non sarà mai raggiunta.")
    }
}