Sobes.tech
Junior — Middle

O que distingue o NSRecursiveLock do NSLock padrão no contexto de multithreading?

sobes.tech IA

Resposta da IA

NSLock é um bloqueio simples de exclusão mútua que não permite que uma thread entre na secção crítica se outra thread já estiver a segurar o bloqueio. Se uma thread que já segura o NSLock tentar adquiri-lo novamente, ela ficará bloqueada, o que levará a um deadlock.

NSRecursiveLock difere ao permitir que a mesma thread adquira o bloqueio várias vezes sem ficar bloqueada. Isto é útil quando métodos recursivos usam o mesmo bloqueio. NSRecursiveLock mantém um contador de aquisições, e o bloqueio só é libertado após o número correspondente de chamadas a unlock.

Exemplo:

let lock = NSRecursiveLock()

func recursiveFunction(_ count: Int) {
    lock.lock()
    defer { lock.unlock() }
    if count > 0 {
        recursiveFunction(count - 1) // aquisição recursiva do bloqueio na mesma thread
    }
}

recursiveFunction(3)

Se fosse usado NSLock, ocorreria um deadlock na chamada recursiva.