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.