Junior — Middle
106
Qu'est-ce qui distingue NSRecursiveLock de la NSLock standard dans le contexte de la multitâche?
Entreprises à qui on a demandé
Réponse de l'IA
sobes.tech IA
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, то при рекурсивном вызове возник бы дедлок.