Sobes.tech
Junior — Middle

Kā atšķiras NSRecursiveLock no standarta NSLock daudzprocesu kontekstā?

sobes.tech AI

Atbilde no AI

NSLock ir vienkāršs savstarpējs izslēgšanas aizslēgs, kas neatļauj vienam pavedienam ieiet kritiskajā sadaļā, ja cits pavediens jau to tur. Ja tas pats pavediens, kurš jau tur NSLock, mēģina to vēlreiz iegūt, tas tiks bloķēts, kas novedīs pie deadlock.

NSRecursiveLock atšķiras ar to, ka tas ļauj tam pašam pavedienam vairākas reizes pēc kārtas iegūt aizslēgu bez bloķēšanas. Tas ir noderīgi, ja rekursīvas metodes izmanto to pašu aizslēgu. NSRecursiveLock uztur iegūšanas skaitītāju, un aizslēgs tiek atbrīvots tikai pēc atbilstoša unlock izsaukumu skaita.

Piemērs:

let lock = NSRecursiveLock()

func recursiveFunction(_ count: Int) {
    lock.lock()
    defer { lock.unlock() }
    if count > 0 {
        recursiveFunction(count - 1) // rekursīva aizslēga iegūšana tajā pašā pavedienā
    }
}

recursiveFunction(3)

Ja tiktu izmantots NSLock, rekursīvās izsaukšanas laikā notiktu deadlock.