Junior
¿Qué es un bloqueo mutuo?
sobes.tech AI
Respuesta de la IA
El bloqueo mutuo (Deadlock) es un estado en el que dos o más hilos o procesos se bloquean, esperando unos a otros para continuar con la ejecución. Ocurre cuando cada hilo posee un recurso que necesita otro hilo, y a su vez espera que otro hilo libere ese recurso.
Cuatro condiciones necesarias para que ocurra un deadlock (condiciones de Coffman):
- Exclusión mutua (Mutual Exclusion): El recurso no puede ser utilizado simultáneamente por varios procesos.
- Retención y espera (Hold and Wait): Un hilo que ya posee al menos un recurso espera obtener recursos adicionales que están siendo utilizados por otros hilos.
- No liberación forzada (No Preemption): Los recursos no pueden ser arrebatados por la fuerza a un hilo. Solo pueden ser liberados voluntariamente por el hilo que los posee.
- Espera circular (Circular Wait): Existe un ciclo de espera entre dos o más hilos. Por ejemplo, el Hilo A espera un recurso que posee el Hilo B, que a su vez espera un recurso que posee el Hilo C, que a su vez espera un recurso que posee el Hilo A.
En el desarrollo de iOS, los deadlocks ocurren frecuentemente al trabajar con concurrencia, por ejemplo, al usar incorrectamente GCD (Grand Central Dispatch) o las colas de operaciones:
- Intentar ejecutar de forma síncrona un bloque de código en una cola en la que ya se encuentra el hilo actual (por ejemplo, llamar a
syncen la colamaindesde el hilo principal). - Dos hilos intentan adquirir dos cerraduras o semáforos en orden diferente.
Ejemplo simple de deadlock usando GCD:
func deadlockExample() {
// Cola principal
let mainQueue = DispatchQueue.main
// Ejecutar de forma síncrona un bloque en la cola principal desde el hilo principal
// El hilo principal espera a que termine el bloque,
// y el bloque no puede ejecutarse porque el hilo principal está ocupado esperando.
mainQueue.sync {
print("Esta línea nunca será alcanzada.")
}
}