Υπό κανονικές συνθήκες, εφόσον εμπλέκεται προγραμματισμός πολλαπλών νημάτων, η πολυπλοκότητα του προγράμματος θα αυξηθεί σημαντικά, η απόδοση θα μειωθεί σημαντικά και η πιθανότητα σφαλμάτων θα αυξηθεί σημαντικά.
Ο πολυνηματικός προγραμματισμός προορίζεται για την παράλληλη εκτέλεση ενός προγράμματος για τη βελτίωση των δυνατοτήτων επεξεργασίας δεδομένων, αλλά στις περισσότερες περιπτώσεις, περιλαμβάνει ανταγωνισμό για κοινόχρηστους πόρους, επομένως πρέπει να κλειδώνεται κατά την τροποποίηση αντικειμένων πόρων. Ωστόσο, υπάρχουν πολλοί τρόποι εφαρμογής κλειδαριών, οπότε ας ρίξουμε μια ματιά στην εφαρμογή και την απόδοση πολλών τύπων κλειδαριών στη C#.
Διάφοροι τρόποι χρήσης κλειδαριών
1. Ατομική κλειδαριά
Επίτευξη ανταγωνισμού «χωρίς κλείδωμα» μέσω της ατομικής λειτουργίας Interlocked.CompareExchange.
Η επίσημη εξήγηση είναι η παροχή ατομικών πράξεων για μεταβλητές που μοιράζονται πολλαπλά νήματα. Χώρος ονομάτων: System.Threading
2. Κρίσιμος τομέας
Η σειριοποίηση πολλαπλών νημάτων για πρόσβαση σε δημόσιους πόρους ή ένα κομμάτι κώδικα είναι γρήγορη και κατάλληλη για τον έλεγχο της πρόσβασης σε δεδομένα. Η σύνταξη κλειδώματος στη C# είναι ένα σάκχαρο σύνταξης για την κρίσιμη περιοχή (Monitor).
3. Ατομική λειτουργία
Οι ατομικές λειτουργίες, που αποτελούν ειδική περίπτωση, είναι εγγενώς ασφαλείς για το νήμα, επομένως δεν χρειάζεται να τις κλειδώσετε.
Επίσημα ερμηνεύεται ως αύξηση της τιμής μιας δεδομένης μεταβλητής με τη μορφή ατομικής πράξης και αποθήκευση του αποτελέσματος. Χώρος ονομάτων: System.Threading
4. Κλειδαριά ανάγνωσης και εγγραφής
Τα κλειδώματα ανάγνωσης-εγγραφής επιτρέπουν την ανάγνωση πόρων όταν γράφουν άλλα προγράμματα, επομένως εάν ο πόρος επιτρέπει βρώμικες αναγνώσεις, αυτό είναι πιο κατάλληλο.
Η επίσημη εξήγηση υποδεικνύει μια κλειδωμένη κατάσταση που χρησιμοποιείται για τη διαχείριση της πρόσβασης σε πόρους, επιτρέποντας αναγνώσεις πολλαπλών νημάτων ή αποκλειστική πρόσβαση εγγραφής. Ο χώρος ονομάτων είναι System.Threading
5. Σηματοφόρος
Σηματοφόροι, σχεδιασμένοι για τον έλεγχο περιορισμένου αριθμού πόρων χρήστη.
Η επίσημη εξήγηση περιορίζει τον αριθμό των νημάτων που μπορούν να έχουν πρόσβαση σε έναν πόρο ή μια ομάδα πόρων ταυτόχρονα. Ο χώρος ονομάτων είναι System.Threading
6. Εκδηλώσεις
Χρησιμοποιείται για να ειδοποιήσει το νήμα ότι έχουν συμβεί ορισμένα συμβάντα, ξεκινώντας την έναρξη μιας εξαρτώμενης εργασίας.
Η επίσημη εξήγηση αναφέρει ότι τα συμβάντα συγχρονισμού νημάτων επαναφέρονται αυτόματα όταν λαμβάνεται ένα σήμα μετά την απελευθέρωση ενός νήματος. Τέτοιοι τύποι δεν μπορούν να κληρονομηθούν.
7. Αμοιβαίος αποκλεισμός
Υπάρχει μια κλάση Mutex στη C#, ακριβώς κάτω από τον χώρο ονομάτων System.Threading, το Mutex είναι στην πραγματικότητα ένα mutex, το οποίο όχι μόνο μπορεί να αντιμετωπίσει τον ανταγωνισμό πόρων μεταξύ πολλαπλών νημάτων, αλλά και να χειριστεί τον ανταγωνισμό πόρων μεταξύ των διαδικασιών.
Κωδικός δοκιμής απόδοσης
Εκτελέστε τον κώδικα
Αποτελέσματα δοκιμών απόδοσης
Σημείωση: Τα παραπάνω δεδομένα είναι μόνο το αποτέλεσμα της απόδοσης υλικού του τρέχοντος περιβάλλοντος δοκιμής και μπορούν να συγκριθούν μόνο μεταξύ τους.
1) Σε διάφορες δοκιμές, είναι σίγουρα το πιο γρήγορο να μην κλειδώνετε, επομένως προσπαθήστε να αποφύγετε τον ανταγωνισμό πόρων που οδηγεί σε κλειδωμένη λειτουργία.
2) Το Interlocked.CompareExchange δείχνει σταθερά ανώτερη απόδοση στο multi-threading, καταλαμβάνοντας τη δεύτερη θέση.
3) Η τρίτη κλειδαριά, η κρίσιμη ζώνη δείχνει επίσης καλή απόδοση, γι' αυτό διαψεύστε τους άλλους όταν λένε ότι η απόδοση κλειδώματος είναι χαμηλή.
4) Η τέταρτη θέση είναι η λειτουργία ατομικής μεταβλητής (Ατομική), αλλά προς το παρόν, υποστηρίζει μόνο την αυτοαύξηση και αφαίρεση μεταβλητών και η δυνατότητα εφαρμογής δεν είναι ισχυρή.
5) Η απόδοση του πέμπτου κλειδώματος ανάγνωσης/εγγραφής (ReaderWriterLockSlim) είναι επίσης εντάξει και δεν υποστηρίζει την ανάγνωση τίποτα και η πρακτικότητα εξακολουθεί να είναι σχετικά καλή.
6) Οι υπόλοιποι σηματοφόροι, συμβάντα και mutex έχουν τη χειρότερη απόδοση, φυσικά, έχουν το δικό τους πεδίο εφαρμογής, αλλά δεν έχουν καλή απόδοση στην αντιμετώπιση του ανταγωνισμού πόρων.
Αρχική διεύθυνση συνδέσμου:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
|