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):
- Esclusione mutua (Mutual Exclusion): La risorsa non può essere utilizzata contemporaneamente da più processi.
- 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.
- Nessuna preemption (No Preemption): Le risorse non possono essere forzatamente sottratte a un thread. Possono essere rilasciate volontariamente dal thread che le possiede.
- 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
syncsulla codamaindal 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.")
}
}