Τι διαχωρίζει το 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 κατά την αναδρομική κλήση.