Sobes.tech
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:

  1. Obtiene el recurso A.
  2. Intenta obtener el recurso B. Si no puede, libera A y comienza de nuevo.

Hilo 2:

  1. Obtiene el recurso B.
  2. 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)
        }
    }
}
``