Wat onderscheidt NSRecursiveLock van de standaard NSLock in de context van multithreading?
sobes.tech AI
Antwoord van AI
NSLock is een eenvoudige onderlinge uitsluitingsslot dat niet toestaat dat één thread de kritieke sectie binnenkomt als een andere thread het slot al vasthoudt. Als een thread dat al het NSLock vasthoudt probeert het opnieuw te verkrijgen, wordt het geblokkeerd, wat leidt tot een deadlock.
NSRecursiveLock verschilt doordat het dezelfde thread toestaat het slot meerdere keren achter elkaar te verkrijgen zonder geblokkeerd te worden. Dit is handig wanneer recursieve methoden hetzelfde slot gebruiken. NSRecursiveLock houdt een teller bij van de veroveringen, en het slot wordt pas vrijgegeven na het overeenkomstige aantal unlock-aanroepen.
Voorbeeld:
let lock = NSRecursiveLock()
func recursiveFunction(_ count: Int) {
lock.lock()
defer { lock.unlock() }
if count > 0 {
recursiveFunction(count - 1) // recursieve verovering van het slot in dezelfde thread
}
}
recursiveFunction(3)
Als NSLock werd gebruikt, zou er een deadlock ontstaan bij de recursieve aanroep.