Junior — Middle
Čím se liší NSRecursiveLock od standardního NSLock v kontextu vícenásobného zpracování?
sobes.tech AI
Odpověď od AI
NSLock je jednoduchý vzájemně vylučující zámek, který neumožňuje jednomu vláknu vstoupit do kritické sekce, pokud jiná vlákno již zámek drží. Pokud se pokusí zámek znovu získat vlákno, které jej již drží, bude zablokováno, což povede k deadlocku.
NSRecursiveLock se liší tím, že umožňuje stejnému vláknu získat zámek několikrát za sebou bez zablokování. To je užitečné při rekurzivním volání metod, které používají stejný zámek. NSRecursiveLock udržuje čítač získání, a zámek je uvolněn až po odpovídajícím počtu volání unlock.
Příklad:
let lock = NSRecursiveLock()
func recursiveFunction(_ count: Int) {
lock.lock()
defer { lock.unlock() }
if count > 0 {
recursiveFunction(count - 1) // rekurzivní získání zámku ve stejném vlákně
}
}
recursiveFunction(3)
Pokud by byl použit NSLock, při rekurzivním volání by došlo k deadlocku.