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.