Βασικές έννοιες:
* Αμοιβαία αποκλεισμός: Μια κλειδαριά εξασφαλίζει ότι μόνο ένα νήμα μπορεί να κρατήσει την κλειδαριά κάθε φορά. Οποιοδήποτε άλλο νήμα που επιχειρεί να αποκτήσει την κλειδαριά θα μπλοκαριστεί μέχρι να απελευθερωθεί η κλειδαριά. Αυτό εγγυάται τον αμοιβαίο αποκλεισμό - μόνο ένα νήμα μπορεί να έχει πρόσβαση στην κρίσιμη ενότητα (ο κώδικας που προστατεύεται από την κλειδαριά) κάθε φορά.
* Αποκτήστε την κλειδαριά: Πριν από την πρόσβαση σε έναν κοινό πόρο, ένα νήμα πρέπει να αποκτήσει (ή να αποκτήσει) την κλειδαριά.
* απελευθέρωση της κλειδαριάς: Μετά την πρόσβαση στον κοινό πόρο, το νήμα πρέπει να απελευθερώσει (ή να ξεκλειδώσει) την κλειδαριά, επιτρέποντας σε άλλα νήματα να έχουν πρόσβαση σε αυτό.
* Deadlocks: Ένα αδιέξοδο συμβαίνει όταν δύο ή περισσότερα νήματα μπλοκαρισμένα επ 'αόριστον, περιμένοντας ο ένας τον άλλον να απελευθερώσει τις κλειδαριές που χρειάζονται. Ο προσεκτικός σχεδιασμός και η παραγγελία της απόκτησης κλειδώματος είναι ζωτικής σημασίας για την αποφυγή αδιέξοδο.
Παράδειγμα (εννοιολογική python):
`` `Python
Εισαγωγή σπειρώματος
shared_resource =0
κλειδαριά =threading.lock ()
def increment_resource ():
Global shared_resource
lock.acquire () # Αποκτήστε την κλειδαριά
δοκιμή:
shared_resource +=1
τελικά:
lock.release () # Απελευθερώστε την κλειδαριά, ακόμη και αν συμβούν εξαιρέσεις
νήματα =[]
για το I στην περιοχή (10):
Thread =Threading.Thread (Target =Increment_Resource)
threads.append (νήμα)
Thread.start ()
για νήμα σε νήματα:
Thread.join ()
εκτύπωση (F "Τελική τιμή του shared_resource:{shared_resource}") # πρέπει να είναι 10
`` `
Σε αυτό το παράδειγμα:
* `threading.lock ()` δημιουργεί ένα αντικείμενο κλειδώματος.
* `lock.acquire ()` Προσπαθεί να αποκτήσει την κλειδαριά. Εάν ένα άλλο νήμα κρατά την κλειδαριά, αυτή η κλήση θα μπλοκάρει μέχρι να απελευθερωθεί η κλειδαριά.
* `lock.release ()` απελευθερώνει την κλειδαριά. Το `try ... Τέλος, το μπλοκ εξασφαλίζει ότι η κλειδαριά απελευθερώνεται πάντα, ακόμη και αν εμφανιστεί μια εξαίρεση μέσα στη λειτουργία` increment_resource '.
Τύποι κλειδαριών (παραλλαγές):
* Αναδρομικές κλειδαριές (κλειδαριές επανένταξης): Αφήστε το ίδιο νήμα να αποκτήσει την κλειδαριά πολλές φορές χωρίς να μπλοκάρει. Χρήσιμο σε καταστάσεις όπου μια λειτουργία καλείται αναδρομικά και πρέπει να έχει πρόσβαση σε έναν κοινό πόρο.
* Κλειδαριές ανάγνωσης: Επιτρέψτε σε πολλαπλά νήματα να διαβάζουν ταυτόχρονα τον κοινόχρηστο πόρο, αλλά μόνο ένα νήμα μπορεί να γράψει κάθε φορά. Αυτό βελτιώνει την ταυτότητα σε σύγκριση με μια απλή κλειδαριά mutex.
* Μεταβλητές κατάστασης: Χρησιμοποιείται σε συνδυασμό με κλειδαριές για να επιτρέπεται στα νήματα να περιμένουν να γίνουν αληθινές συγκεκριμένες συνθήκες πριν από την πρόσβαση σε έναν κοινό πόρο. Παρέχουν πιο εξελιγμένο συγχρονισμό από απλές κλειδαριές.
* Σημειογραφικά: Γενικεύστε τις κλειδαριές · Επιτρέπουν ένα συγκεκριμένο αριθμό νημάτων για πρόσβαση σε έναν κοινό πόρο ταυτόχρονα. Ένα σηματοφόρο με αριθμό 1 είναι ουσιαστικά μια κλειδαριά mutex.
Σημαντικές εκτιμήσεις:
* Κλείδωμα λεπτομερότητας: Επιλέξτε το κατάλληλο επίπεδο λεπτομέρειας για τις κλειδαριές σας. Το πολύ λεπτόκοκκο κλείδωμα μπορεί να οδηγήσει σε υπερβολική επιβάρυνση, ενώ το υπερβολικά χονδροειδές κλείδωμα μπορεί να περιορίσει την ταυτότητα.
* Πρόληψη αδιέξοδο: Πάντα να αποκτάτε κλειδαριές με την ίδια σειρά για να αποφύγετε τα αδιέξοδα. Χρησιμοποιήστε τεχνικές όπως ανίχνευση αδιέξοδο και αποφυγή για να μετριάσετε τον κίνδυνο.
* πείνα: Βεβαιωθείτε ότι κανένα νήμα δεν εμποδίζεται συνεχώς από την απόκτηση κλειδαριάς. Οι μηχανισμοί δικαιοσύνης μπορούν να βοηθήσουν στην πρόληψη της λιμοκτονίας.
* απόδοση: Οι κλειδαριές εισάγουν πάνω από το κεφάλι. Εξετάστε τους εναλλακτικούς μηχανισμούς συγχρονισμού όπως οι ατομικές λειτουργίες ή οι δομές δεδομένων χωρίς κλειδαριά, όπου χρειάζεται.
Η συγκεκριμένη εφαρμογή των κλειδαριών ποικίλλει σε όλες τις γλώσσες προγραμματισμού. Τα παραδείγματα και οι έννοιες που παρέχονται εδώ είναι γενικά και εφαρμόζονται σε γενικές γραμμές, αλλά η ακριβής σύνταξη και οι διαθέσιμοι τύποι κλειδαριών θα διαφέρουν σε γλώσσες όπως η Java, C ++, C#, Go, κλπ. Συμβουλευτείτε την τεκμηρίωση της γλώσσας σας για τις λεπτομέρειες.
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα