Sobes.tech
Junior — Middle
105

Cosa distingue NSRecursiveLock dal normale NSLock nel contesto del multithreading?

Le aziende dove è stato chiesto
Т-БанкТ-Банк

Risposta dell'AI

sobes.tech AI

NSLock — это простой взаимный исключающий замок, который не позволяет одному потоку войти в критическую секцию, если другой поток уже удерживает замок. Если поток, который уже удерживает NSLock, попытается захватить его повторно, он заблокируется, что приведет к дедлоку.

NSRecursiveLock отличается тем, что позволяет одному и тому же потоку захватывать замок несколько раз подряд без блокировки. Это полезно, когда рекурсивно вызываются методы, которые используют один и тот же замок. NSRecursiveLock ведёт счётчик захватов, и замок освобождается только после соответствующего количества вызовов unlock.

Пример:

let lock = NSRecursiveLock()

func recursiveFunction(_ count: Int) {
    lock.lock()
    defer { lock.unlock() }
    if count > 0 {
        recursiveFunction(count - 1) // повторный захват замка в том же потоке
    }
}

recursiveFunction(3)

Если бы использовался NSLock, то при рекурсивном вызове возник бы дедлок.