Junior — Middle
Какво отличава NSRecursiveLock от стандартния NSLock в контекста на многопоточността?
sobes.tech AI
Отговор от AI
NSLock е прост взаимно изключващ заключване, което не позволява на един поток да влезе в критичната секция, ако друг поток вече държи заключването. Ако потокът, който вече държи NSLock, се опита да го придобие отново, той ще бъде блокиран, което ще доведе до deadlock.
NSRecursiveLock се различава по това, че позволява на същия поток да придобие заключването няколко пъти подред без да бъде блокиран. Това е полезно, когато рекурсивни методи се извикват и използват същото заключване. NSRecursiveLock поддържа брояч на придобиванията, и заключването се освобождава само след съответния брой извиквания на unlock.
Пример:
let lock = NSRecursiveLock()
func recursiveFunction(_ count: Int) {
lock.lock()
defer { lock.unlock() }
if count > 0 {
recursiveFunction(count - 1) // рекурсивно придобиване на заключването в същия поток
}
}
recursiveFunction(3)
Ако беше използван NSLock, при рекурсивното извикване щеше да възникне deadlock.