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