Sobes.tech
Junior — Middle

Šta razlikuje NSRecursiveLock od standardnog NSLock u kontekstu višestrukog izvršavanja?

sobes.tech АИ

Одговор од АИ

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-а.