Middle+
¿Qué es un livelock?
sobes.tech AI
Respuesta de la IA
Livelock es un estado similar a deadlock, pero en lugar de bloquear los hilos, estos intentan constantemente realizar trabajo, cancelando las acciones entre sí debido a la competencia por recursos, lo que lleva a su incapacidad para avanzar.
Ejemplo de livelock: dos hilos intentan obtener dos recursos A y B. Hilo 1:
- Obtiene el recurso A.
- Intenta obtener el recurso B. Si no puede, libera A y comienza de nuevo.
Hilo 2:
- Obtiene el recurso B.
- Intenta obtener el recurso A. Si no puede, libera B y comienza de nuevo.
Como resultado, los hilos pueden liberar constantemente los recursos y volver a intentar obtenerlos, sin alcanzar un objetivo.
Diferencias con deadlock:
- Deadlock: los hilos están bloqueados, esperando unos a otros.
- Livelock: los hilos trabajan activamente, pero no progresan.
Prevención:
- Acceso ordenado a los recursos.
- Tiempos de espera al intentar obtener un recurso.
- Evitar dependencias complejas entre recursos.
Ejemplo de pseudocódigo con intento de livelock:
// Recurso 1
let resource1 = NSLock()
// Recurso 2
let resource2 = NSLock()
// Hilo 1
DispatchQueue.global().async {
while true {
resource1.lock()
if resource2.tryLock() {
// Se han obtenido ambos recursos con éxito
// Realizar trabajo
print("Hilo 1 realiza trabajo")
resource2.unlock()
resource1.unlock()
break // Terminar el ciclo tras éxito
} else {
// No se pudo obtener resource2, liberar resource1 y reintentar
resource1.unlock()
// Pequeña pausa para evitar reintentos inmediatos,
// pero esto no garantiza prevenir livelock
Thread.sleep(forTimeInterval: 0.01)
}
}
}
// Hilo 2
DispatchQueue.global().async {
while true {
resource2.lock()
if resource1.tryLock() {
// Se han obtenido ambos recursos con éxito
// Realizar trabajo
print("Hilo 2 realiza trabajo")
resource1.unlock()
resource2.unlock()
break // Terminar el ciclo tras éxito
} else {
// No se pudo obtener resource1, liberar resource2 y reintentar
resource2.unlock()
// Pequeña pausa
Thread.sleep(forTimeInterval: 0.01)
}
}
}
``