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.