C++ Mutex Lock

C Mutex Lock



Η C ++ είναι γνωστό ότι είναι μια από τις πιο γρήγορες γλώσσες προγραμματισμού με καλή απόδοση, υψηλή ακρίβεια και επαρκές σύστημα διαχείρισης μνήμης. Αυτή η γλώσσα προγραμματισμού υποστηρίζει επίσης την ταυτόχρονη εκτέλεση πολλαπλών νημάτων με την κοινή χρήση πολλών πόρων μεταξύ τους. Στο multithreading, το νήμα εκτελεί μόνο τη λειτουργία ανάγνωσης που δεν δημιουργεί προβλήματα, καθώς το νήμα δεν επηρεάζεται από το τι κάνουν τα άλλα νήματα εκείνη τη στιγμή. Αλλά αν αυτά τα νήματα έπρεπε να μοιράζονται τους πόρους μεταξύ τους, ένα νήμα μπορεί να τροποποιήσει τα δεδομένα εκείνη τη στιγμή που δημιουργεί το πρόβλημα. Για να αντιμετωπίσουμε αυτό το πρόβλημα, έχουμε το 'Mutex' της C++ που εμποδίζει την πρόσβαση πολλαπλών πόρων προς τον κώδικα/αντικείμενό μας παρέχοντας τον συγχρονισμό που δηλώνει ότι η πρόσβαση στο αντικείμενο/κώδικα μπορεί να παρέχεται μόνο σε ένα νήμα τη φορά, έτσι ώστε πολλαπλά νήματα να μην μπορούν να έχουν πρόσβαση σε αυτό το αντικείμενο ταυτόχρονα.

Διαδικασία:

Θα μάθουμε πώς μπορούμε να σταματήσουμε την πρόσβαση πολλαπλών νημάτων σε ένα αντικείμενο ταυτόχρονα χρησιμοποιώντας το mutex lock. Θα μιλήσουμε για τη σύνταξη του κλειδώματος mutex, τι είναι το πολλαπλό threading και πώς μπορούμε να αντιμετωπίσουμε τα ζητήματα που προκαλούνται από το πολλαπλό threading χρησιμοποιώντας το mutex lock. Στη συνέχεια, θα πάρουμε ένα παράδειγμα του πολλαπλού νήματος και θα εφαρμόσουμε το κλείδωμα mutex σε αυτά.







Σύνταξη:

Εάν θέλουμε να μάθουμε πώς μπορούμε να εφαρμόσουμε το κλείδωμα mutex έτσι ώστε να αποτρέψουμε την πρόσβαση πολλαπλών νημάτων ταυτόχρονα προς το αντικείμενο ή τον κώδικά μας, μπορούμε να χρησιμοποιήσουμε την ακόλουθη σύνταξη:



$ std :: mutex mut_x

$mut_x. κλειδαριά ( ) ;

Άκυρο func_name ( ) {

$ // ο κώδικας που θέλουμε να κρύψουμε από τα πολλαπλά νήματα θα γραφόταν εδώ

$mut_x. ξεκλειδώνει ( ) ;

}

Τώρα θα χρησιμοποιήσουμε αυτήν τη σύνταξη στο εικονικό παράδειγμα και στον ψευδοκώδικα (που δεν μπορούμε να τον εκτελέσουμε όπως είναι στον επεξεργαστή κώδικα) για να σας ενημερώσουμε πώς μπορούμε να χρησιμοποιήσουμε ακριβώς αυτήν τη σύνταξη όπως αναφέρεται παρακάτω:



$ std :: mutex mut_x

Κενό μπλοκ ( ) {

$mut_x. κλειδαριά ( ) ;

$ std :: cout << 'Χαίρετε' ;

$mut_x. ξεκλειδώνει ( ) ;

}

Παράδειγμα:

Σε αυτό το παράδειγμα, ας προσπαθήσουμε να δημιουργήσουμε πρώτα τη λειτουργία πολλαπλών νημάτων και στη συνέχεια να περιβάλουμε αυτήν τη λειτουργία με κλείδωμα και ξεκλείδωμα mutex για να παράσχουμε τον συγχρονισμό της λειτουργίας με τον κώδικα ή το αντικείμενο που δημιουργήθηκε. Το Mutex ασχολείται με τις συνθήκες αγώνων, οι οποίες είναι οι τιμές που είναι αρκετά απρόβλεπτες και εξαρτώνται από την εναλλαγή των νημάτων που έχουν επίγνωση του χρόνου. Για να εφαρμόσουμε το παράδειγμα για το mutex, πρέπει πρώτα να εισαγάγουμε τις σημαντικές και απαιτούμενες βιβλιοθήκες από τα αποθετήρια. Οι απαιτούμενες βιβλιοθήκες είναι:





$ # περιλαμβάνουν

$ # περιλαμβάνει <νήμα>

$ # περιλαμβάνουν

Η βιβλιοθήκη 'iostream' μας παρέχει μια λειτουργία για να εμφανίζουμε τα δεδομένα ως Cout, να διαβάζουμε τα δεδομένα ως Cin και να τερματίζουμε τη δήλωση ως endl. Χρησιμοποιούμε τη βιβλιοθήκη «νημάτων» για να χρησιμοποιήσουμε τα προγράμματα ή τις συναρτήσεις από τα νήματα. Η βιβλιοθήκη 'mutex' μας επιτρέπει να εφαρμόσουμε τόσο το κλείδωμα όσο και το ξεκλείδωμα mutex στον κώδικα. Χρησιμοποιούμε το '# include' επειδή αυτό επιτρέπει όλα τα προγράμματα που σχετίζονται με τη βιβλιοθήκη που περιλαμβάνονται στον κώδικα.

Τώρα, αφού ολοκληρωθεί το προηγούμενο βήμα, ορίζουμε την κλάση mutex ή μια καθολική μεταβλητή για το mutex χρησιμοποιώντας το std. Στη συνέχεια, δημιουργούμε μια συνάρτηση κλειδώματος και ξεκλειδώματος mutex που θα μπορούσαμε να καλέσουμε μετά στον κώδικα. Σε αυτό το παράδειγμα, ονομάζουμε αυτή τη συνάρτηση ως μπλοκ. Στο σώμα της συνάρτησης μπλοκ, πρώτα καλούμε το “mutex.lock()” και αρχίζουμε να γράφουμε τη λογική του κώδικα.



Η mutex.lock() αρνείται την πρόσβαση των άλλων νημάτων για να φτάσουν στο αντικείμενο ή τον κώδικα που δημιουργήσαμε, έτσι ώστε μόνο ένα νήμα να μπορεί να διαβάσει το αντικείμενό μας τη φορά. Στη λογική, εκτελούμε έναν βρόχο for που τρέχει στο ευρετήριο από το 0 έως το 9. Εμφανίζουμε τις τιμές στον βρόχο. Μόλις δημιουργηθεί αυτή η λογική στο κλείδωμα mutex αφού ολοκληρωθεί η λειτουργία του ή μετά την έξοδο από τη λογική, καλούμε τη μέθοδο 'mutex.unlock()'. Αυτή η κλήση μεθόδου μας επιτρέπει να ξεκλειδώσουμε το δημιουργημένο αντικείμενο από το mutex lock αφού η πρόσβαση του αντικειμένου σε ένα νήμα είχε παρασχεθεί νωρίτερα και μόλις η λειτουργία σε αυτό το αντικείμενο γίνει από ένα νήμα τη φορά. Τώρα θέλουμε και τα άλλα νήματα να έχουν πρόσβαση σε αυτό το αντικείμενο ή τον κώδικα. Διαφορετικά, ο κώδικάς μας κινείται στην κατάσταση «αδιεξόδου» που κάνει το αντικείμενο που δημιουργήθηκε με το mutex να παραμείνει στην κλειδωμένη κατάσταση για πάντα και κανένα άλλο νήμα δεν θα μπορούσε να έχει πρόσβαση σε αυτό το αντικείμενο. Ως εκ τούτου, μια ημιτελής λειτουργία συνεχίζει να εκτελείται. Μετά από αυτό, βγαίνουμε από τη λειτουργία μπλοκ και μεταβαίνουμε στην κύρια.

Κυρίως, απλώς εμφανίζουμε το mutex που δημιουργήσαμε δημιουργώντας τα τρία νήματα χρησιμοποιώντας το 'std :: thread thread_name (καλώντας την ήδη δημιουργημένη συνάρτηση μπλοκ εδώ στην οποία δημιουργήσαμε το mutex)' με τα ονόματα thread1, thread2 και thread3, κ.λπ. Με αυτόν τον τρόπο δημιουργούνται τα τρία νήματα. Στη συνέχεια ενώνουμε αυτά τα τρία νήματα για να εκτελεστούν ταυτόχρονα καλώντας το 'thread_name. μέθοδος join ()”. Και μετά, επιστρέφουμε την τιμή ίση με το μηδέν. Η προαναφερθείσα εξήγηση του παραδείγματος υλοποιείται με τη μορφή του κώδικα που φαίνεται στο παρακάτω σχήμα:

Στην έξοδο του κώδικα, μπορούμε να δούμε την εκτέλεση και την εμφάνιση και των τριών νημάτων ένα προς ένα. Μπορούμε να δούμε ακόμα και αν η εφαρμογή μας εμπίπτει στην κατηγορία του multithreading. Ωστόσο, κανένα από τα νήματα δεν έχει αντικαταστήσει ή τροποποιήσει τα δεδομένα και δεν μοιράστηκε τον τροποποιημένο πόρο λόγω της υλοποίησης του mutex του 'μπλοκ συνάρτησης'.

συμπέρασμα

Αυτός ο οδηγός δίνει μια λεπτομερή εξήγηση της έννοιας της συνάρτησης mutex που χρησιμοποιείται στη C++. Συζητήσαμε ποιες είναι οι εφαρμογές πολλαπλών νημάτων, ποια προβλήματα πρέπει να αντιμετωπίσουμε στις εφαρμογές πολλαπλών νημάτων και γιατί πρέπει να εφαρμόσουμε το mutex για εφαρμογές πολλαπλών νημάτων. Στη συνέχεια συζητήσαμε τη σύνταξη για το mutex με το εικονικό παράδειγμα χρησιμοποιώντας τον ψευδοκώδικα. Στη συνέχεια, εφαρμόσαμε ένα πλήρες παράδειγμα για τις εφαρμογές πολλαπλών νημάτων με το mutex στο C++ visual studio.