Sobes.tech
Junior — Middle

Čo odlišuje NSRecursiveLock od štandardného NSLock v kontexte viacvláknového programovania?

sobes.tech AI

Odpoveď od AI

NSLock je jednoduchý vzájomne vylučujúci zámok, ktorý neumožňuje jednému vláknu vstúpiť do kritickej sekcie, ak iné vlákno už drží zámok. Ak sa pokúsi vlákno, ktoré už drží NSLock, získať ho znova, bude zablokované, čo povedie k deadlocku.

NSRecursiveLock sa líši tým, že umožňuje rovnakému vláknu získať zámok viackrát za sebou bez zablokovania. Je to užitočné pri rekurzívnych volaniach metód, ktoré používajú ten istý zámok. NSRecursiveLock udržiava čítač získaní a zámok sa uvoľní až po príslušnom počte volaní unlock.

Príklad:

let lock = NSRecursiveLock()

func recursiveFunction(_ count: Int) {
    lock.lock()
    defer { lock.unlock() }
    if count > 0 {
        recursiveFunction(count - 1) // rekurzívne získanie zámku v tom istom vlákne
    }
}

recursiveFunction(3)

Ak by sa použil NSLock, pri rekurzívnom volaní by došlo k deadlocku.