Sobes.tech
Junior — Middle

¿Qué distingue a NSRecursiveLock de la NSLock estándar en el contexto de la multitarea?

sobes.tech AI

Respuesta de la IA

NSLock es un bloqueo simple de exclusión mutua que no permite que un hilo entre en la sección crítica si otro hilo ya tiene el bloqueo. Si un hilo que ya tiene NSLock intenta adquirirlo nuevamente, se bloqueará, lo que conducirá a un deadlock.

NSRecursiveLock se diferencia en que permite que el mismo hilo adquiera el bloqueo varias veces sin bloquearse. Esto es útil cuando se llaman recursivamente métodos que usan el mismo bloqueo. NSRecursiveLock lleva un contador de adquisiciones, y el bloqueo solo se libera después de la cantidad correspondiente de llamadas a unlock.

Ejemplo:

let lock = NSRecursiveLock()

func recursiveFunction(_ count: Int) {
    lock.lock()
    defer { lock.unlock() }
    if count > 0 {
        recursiveFunction(count - 1) // adquisición recursiva del bloqueo en el mismo hilo
    }
}

recursiveFunction(3)

Si se usara NSLock, en la llamada recursiva se produciría un deadlock.