Sobes.tech
Junior — Middle

Czym różni się NSRecursiveLock od standardowego NSLock w kontekście wielowątkowości?

sobes.tech AI

Odpowiedź od AI

NSLock to prosty wzajemny wyłącznik, który nie pozwala jednemu wątkowi wejść do sekcji krytycznej, jeśli inny wątek już go trzyma. Jeśli wątek, który już trzyma NSLock, spróbuje go ponownie przejąć, zostanie zablokowany, co doprowadzi do deadlocka.

NSRecursiveLock różni się tym, że pozwala temu samemu wątkowi na wielokrotne przejęcie blokady bez blokowania się. Jest to przydatne, gdy metody rekurencyjne wywołują się nawzajem i używają tego samego blokady. NSRecursiveLock utrzymuje licznik przejęć, a blokada jest zwalniana dopiero po odpowiedniej liczbie wywołań unlock.

Przykład:

let lock = NSRecursiveLock()

func recursiveFunction(_ count: Int) {
    lock.lock()
    defer { lock.unlock() }
    if count > 0 {
        recursiveFunction(count - 1) // rekurencyjne przejęcie blokady w tym samym wątku
    }
}

recursiveFunction(3)

Gdyby użyto NSLock, podczas rekurencyjnego wywołania wystąpiłby deadlock.