Junior — Middle
Ko'p ipli ishlash kontekstida NSRecursiveLock va standart NSLock qanday farq qiladi?
sobes.tech AI
AIdan javob
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.