Sobes.tech
Junior — Middle

Көптөгөн иштөө контекстинде NSRecursiveLock менен стандарттык NSLock кандай айырмаланат?

sobes.tech AI

AIден жооп

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 пайда болмок.