Junior
Τι είναι το deadlock;
sobes.tech AI
Απάντηση από AI
Deadlock (Αδιέξοδο) είναι μια κατάσταση όπου δύο ή περισσότεροι νήματα ή διαδικασίες μπλοκάρουν το ένα το άλλο, περιμένοντας να ελευθερώσει ο ένας την πόρο για να συνεχίσει την εκτέλεση. Προκύπτει όταν κάθε νήμα κατέχει έναν πόρο που χρειάζεται ένα άλλο νήμα, και περιμένει να ελευθερωθεί αυτός ο πόρος.
Τέσσερις προϋποθέσεις που απαιτούνται για την εμφάνιση deadlock (συνθήκες Coffman):
- Αμοιβαία αποκλειστικότητα (Mutual Exclusion): Ο πόρος δεν μπορεί να χρησιμοποιηθεί ταυτόχρονα από πολλαπλές διαδικασίες.
- Κράτηση και αναμονή (Hold and Wait): Ένα νήμα που ήδη κατέχει τουλάχιστον έναν πόρο περιμένει να αποκτήσει επιπλέον πόρους που κατέχονται από άλλα νήματα.
- Χωρίς προληπτική κατάσχεση (No Preemption): Οι πόροι δεν μπορούν να αφαιρεθούν βίαια από ένα νήμα. Μπορούν να ελευθερωθούν μόνο εθελοντικά από το νήμα που τους κατέχει.
- Κυκλική αναμονή (Circular Wait): Υπάρχει ένας κύκλος αναμονής μεταξύ δύο ή περισσότερων νημάτων. Για παράδειγμα, το νήμα A περιμένει έναν πόρο που κατέχεται από το νήμα B, το οποίο με τη σειρά του περιμένει έναν πόρο που κατέχεται από το νήμα C, το οποίο περιμένει έναν πόρο που κατέχεται από το νήμα A.
Στην ανάπτυξη iOS, τα deadlocks εμφανίζονται συχνά κατά την εργασία με concurrency, για παράδειγμα, κατά τη λανθασμένη χρήση του GCD (Grand Central Dispatch) ή των Operation Queues:
- Προσπάθεια εκτέλεσης ενός μπλοκ κώδικα συγχρονικά σε μια ουρά όπου ήδη βρίσκεται το τρέχον νήμα (π.χ., κλήση
syncστην ουράmainαπό το κύριο νήμα). - Δύο νήματα προσπαθούν να αποκτήσουν δύο κλειδώματα ή semaphore με διαφορετική σειρά.
Παράδειγμα απλού deadlock με χρήση GCD:
func deadlockExample() {
// Κύρια ουρά
let mainQueue = DispatchQueue.main
// Εκτέλεση συγχρονικού μπλοκ στην κύρια ουρά από το κύριο νήμα
// Το κύριο νήμα περιμένει να ολοκληρωθεί το μπλοκ,
// και το μπλοκ δεν μπορεί να εκτελεστεί επειδή το κύριο νήμα είναι απασχολημένο με την αναμονή.
mainQueue.sync {
print("Αυτή η γραμμή δεν θα φτάσει ποτέ.")
}
}