Sobes.tech
Junior — Middle

Ce diferență există între NSRecursiveLock și NSLock-ul standard în contextul multi-threading-ului?

sobes.tech AI

Răspuns de la AI

NSLock este un blocaj simplu de excludere mutuală care nu permite unui fir de execuție să intre în secțiunea critică dacă alt fir de execuție deține deja blocajul. Dacă un fir de execuție care deține deja NSLock încearcă să îl preia din nou, acesta se va bloca, ceea ce duce la un deadlock.

NSRecursiveLock diferă prin faptul că permite aceluiași fir de execuție să preia blocajul de mai multe ori consecutiv fără a se bloca. Acest lucru este util atunci când metodele recursive apelează aceleași blocaje. NSRecursiveLock menține un contor al preluărilor, iar blocajul este eliberat doar după numărul corespunzător de apeluri unlock.

Exemplu:

let lock = NSRecursiveLock()

func recursiveFunction(_ count: Int) {
    lock.lock()
    defer { lock.unlock() }
    if count > 0 {
        recursiveFunction(count - 1) // preluare recursivă a blocajului în același fir
    }
}

recursiveFunction(3)

Dacă s-ar fi folosit NSLock, s-ar fi produs un deadlock în timpul apelului recursiv.