Sobes.tech
Назад к вопросам
Junior — Middle
82

Что отличает NSRecursiveLock от стандартного NSLock в контексте многопоточности?

Компании, где спрашивали
Т-БанкТ-Банк

Ответ от нейросети

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, то при рекурсивном вызове возник бы дедлок.