Πτητική C++

Ptetike C



'Οι προγραμματιστές εφαρμογών χώρου χρήστη θα πρέπει πάντα να αναφέρονται στα σχετικά εγχειρίδια μεταγλωττιστή για να μάθουν πώς μπορεί να χειριστεί το qualifier σε διάφορα περιβάλλοντα, επειδή η συμπεριφορά της άστατης λέξης-κλειδιού θα πρέπει κανονικά να θεωρείται ως εξαρτώμενη από το υλικό. Όταν ένα αντικείμενο επισημαίνεται ως πτητικό, ο μεταγλωττιστής ενημερώνεται συχνά ότι δεν πρέπει ποτέ να βελτιστοποιείται για λειτουργίες φόρτωσης και ότι θα πρέπει πάντα να ανακτάται από την κύρια μνήμη και όχι από καταχωρητές ή κρυφές μνήμες. Ωστόσο, όταν ο μεταγλωττιστής προσπαθεί να βάλει τη θέση της μνήμης στον καταχωρητή, αποθηκεύεται αυτόματα στην κρυφή μνήμη, παρόλο που υπάρχουν πολλά επίπεδα κρυφής μνήμης που δεν είναι σε μεγάλο βαθμό διαθέσιμα στο λογισμικό και διατηρούνται μόνο στο υλικό. Ως αποτέλεσμα, η πρόσβαση στη μνήμη RAM είναι πολλές φορές πιο γρήγορα από τις γραμμές κρυφής μνήμης κοντά στην CPU παρά από την ίδια θέση μνήμης.

Τα ζητήματα θα μπορούσαν να προκύψουν εάν δεν χρησιμοποιήσουμε ένα πτητικό προσδιοριστικό που περιλαμβάνει, όταν είναι ενεργοποιημένη η βελτιστοποίηση, ο κώδικας ενδέχεται να μην λειτουργεί όπως αναμένεται. Όταν χρησιμοποιούνται και ενεργοποιούνται οι διακοπές, ο κωδικός δεν μπορεί να λειτουργήσει όπως έχει προγραμματιστεί. Τα δεδομένα διατηρούνται μόνο σε πτητικό χώρο αποθήκευσης όταν η τροφοδοσία είναι ενεργοποιημένη. Όταν αφαιρεθεί η παροχή, συμβαίνει απώλεια δεδομένων.

Ωστόσο, η μη πτητική αποθήκευση διατηρεί τα δεδομένα ακόμα και αν διακοπεί η τροφοδοσία. Οι πληροφορίες διεργασίας αποθηκεύονται εν συντομία στην πτητική αποθήκευση, καθώς είναι σημαντικά ταχύτερη από τη μη πτητική αποθήκευση. Σε αντίθεση με τη μη πτητική αποθήκευση, η πτητική αποθήκευση είναι πιο κατάλληλη για την προστασία ευαίσθητων δεδομένων. Αυτό συμβαίνει επειδή τα δεδομένα δεν είναι προσβάσιμα όταν η παροχή ρεύματος είναι απενεργοποιημένη. Η πτητική αποθήκευση κοστίζει πολύ, επειδή τα συστήματα υπολογιστών μπορούν να φιλοξενήσουν μόνο μερικά MB έως λίγα GB από αυτήν.'







Ιδιότητες του Volatile Qualifier στη C++

Εδώ θα παρουσιαστεί ο μέσος όρος του πτητικού προσδιορισμού C++. Όταν δηλώνουμε μια μεταβλητή, εφαρμόζεται ο προσδιορισμός 'volatile'. Λειτουργεί ως υπενθύμιση στον μεταγλωττιστή ότι η τιμή ενδέχεται να ποικίλλει ανά πάσα στιγμή. Το πτητικό διαθέτει μερικά από τα χαρακτηριστικά που αναφέρονται παρακάτω.



• Η εκχώρηση μνήμης δεν μπορεί να αλλάξει με τη λέξη-κλειδί πτητική.



• Οι μεταβλητές του μητρώου δεν μπορούν να αποθηκευτούν στην κρυφή μνήμη.





• Όσον αφορά την εκχώρηση, η τιμή δεν μπορεί να αλλάξει.

Χρήση του Volatile Qualifier στη C++

1. Παρόλο που ο κώδικάς σας δεν τροποποιεί την τιμή της μεταβλητής, μπορεί να το κάνει. Ως αποτέλεσμα, κάθε φορά που ο μεταγλωττιστής ελέγχει την κατάσταση της μεταβλητής, δεν μπορεί να υποθέσει ότι είναι ίδια με την πιο πρόσφατη τιμή που διαβάστηκε από αυτήν ή με την πιο πρόσφατη τιμή που έχει αποθηκευτεί. Αντίθετα, πρέπει να αποκτήσει την τιμή της μεταβλητής για άλλη μια φορά.



2. Ο μεταγλωττιστής δεν απαιτείται να εξαλείψει την πράξη της αποθήκευσης μιας τιμής, καθώς είναι μια 'παρενέργεια' που μπορεί να φανεί από έξω και εμφανίζεται όταν μια τιμή αποθηκεύεται σε μια πτητική μεταβλητή. Για παράδειγμα, εάν δύο τιμές τοποθετηθούν σε μια σειρά, ο μεταγλωττιστής πρέπει να βάλει την τιμή δύο φορές.

Σύνταξη του Volatile Qualifier στη C++

# Όνομα_μεταβλητής_τύπου_πτητικών δεδομένων

Η πτητική λέξη-κλειδί πρέπει να χρησιμοποιείται στη δήλωση και ο τύπος δεδομένων αναφέρεται σε οποιονδήποτε τύπο δεδομένων, συμπεριλαμβανομένων των διπλών, float ή ακέραιων. Τέλος, επιλέγουμε ένα όνομα για τη μεταβλητή. Μπορούμε να ορίσουμε μια πτητική μεταβλητή χρησιμοποιώντας οποιαδήποτε από τις μεθόδους αφού και οι δύο δηλώσεις είναι έγκυρες.

Παράδειγμα: Το Volatile Qualifier χρησιμοποιείται για τον εντοπισμό αντικειμένων που μπορούν να τροποποιηθούν από άλλα νήματα ή εξωτερικές ενέργειες στη C++

Εάν το αντικείμενο αλλάξει από ένα εξωτερικό σήμα ή μια διαδικασία που λειτουργεί ως διακοπή, η τροποποιημένη τιμή πρέπει να ανακτηθεί από τη μνήμη RAM, επειδή η κατάσταση προσωρινής αποθήκευσης δεν είναι πλέον κατάλληλη στο μεταξύ. Ως αποτέλεσμα, ο μεταγλωττιστής χειρίζεται κατάλληλα την πρόσβαση σε πτητικά αντικείμενα.

#include
#include
#include <νήμα>

χρησιμοποιώντας std :: cout ;
χρησιμοποιώντας std :: endl ;
χρησιμοποιώντας std :: cerr ;
χρησιμοποιώντας std :: τρώει ;

πτητικός ενθ δευτερόλεπτα = 0 ;

κενός DelayFiveSeconds ( ) {
ενώ ( δευτερόλεπτα < 3 ) {
Κοιμάσαι ( 200000 ) ;
cerr << 'αναμονή...' << endl ;
}
}

κενός IncrementSeconds ( ) {
Για ( ενθ Εγώ = 0 ; Εγώ < 5 ; ++ Εγώ ) {
ύπνος ( 1 ) ;
cerr << 'αυξημένη' << endl ;
δευτερόλεπτα = δευτερόλεπτα + 1 ;
}
}

ενθ κύριος ( ) {
struct χρονική έναρξη { } ;
struct λήξη του χρόνου { } ;
std :: Νήμα νήμα1 ;

νήμα1 = std :: Νήμα ( IncrementSeconds ) ;

DelayFiveSeconds ( ) ;

νήμα1. Συμμετοχή ( ) ;
ΕΠΙΣΤΡΟΦΗ EXIT_SUCCESS ;
}


Για να επεξηγήσουμε το πιθανό σενάριο, χρησιμοποιήσαμε την πτητική λέξη-κλειδί που έχει τη μεταβλητή δηλωμένη ως Δευτερόλεπτα τύπου δεδομένων «int» και της έχει εκχωρήσει μια τιμή 0. Στη συνέχεια, κατασκευάζουμε δύο συναρτήσεις: μια ως 'DelayFiveSeconds' που αλλάζει την καθολική πτητική ακέραια μεταβλητή και μια άλλη ως 'IncrementSeconds' που εκτελεί την ίδια αξιολόγηση εντός του βρόχου while. Θα πρέπει να σημειωθεί ότι αυτό το παράδειγμα επιτρέπει στον βρόχο while να έχει περάσει τα δευτερόλεπτα όταν τα δευτερόλεπτα πρέπει να είναι μικρότερα από 3.

Όταν πληρούται η συνθήκη, τότε θα εκτελεστεί το μπλοκ while. Μέσα στο μπλοκ while, χρησιμοποιήσαμε τη μέθοδο unsleep που εκτυπώνει την πρόταση 'waiting'. Η συνάρτηση 'IncrementSceonds' έχει τον βρόχο for. Μετά την επανάληψη, καλείται η μέθοδος ύπνου, η οποία εκτυπώνει τη δήλωση 'increment' και αυξάνει τη μεταβλητή 'seconds'. Η αρχική εκτέλεση της συνάρτησης 'IncrementSeconds' γίνεται από ένα ξεχωριστό νήμα που δημιουργείται από την κύρια συνάρτηση. Στη συνέχεια, η μέθοδος 'DelayFiveSeconds' καλείται από το κύριο νήμα, εισάγοντας έναν βρόχο που δεν θα τελειώσει εάν η μεταβλητή δευτερόλεπτα δεν κινηθεί πάνω από την τιμή του 5.

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

Για να εκτελέσουμε τον κώδικα νήματος στη C++, θα πρέπει να χρησιμοποιήσουμε την εντολή “g++ -pthread –o filename filename.cc”. Εάν δεν αναπτύξετε το '-pthread' στην εντολή, τότε υπάρχει πιθανότητα να γίνει εξαίρεση από τον μεταγλωττιστή. Ως αποτέλεσμα, δημιουργήσαμε ουσιαστικά μια συνάρτηση αναμονής υπό όρους που περιμένει έως ότου το πτητικό αντικείμενο αλλάξει από μια εξωτερική δύναμη. Είναι σημαντικό να έχετε κατά νου ότι το μπλοκ κώδικα ενημέρωσης μπορεί να προέρχεται από διαφορετική ενότητα μετάφρασης ή ενέργεια εξωτερικού σήματος, παρόλο που αυτός ο κωδικός θα εξακολουθεί να λειτουργεί το ίδιο εάν αφαιρεθεί ο πτητικός προσδιοριστής και χρησιμοποιηθεί μια συμβατική καθολική μεταβλητή.

συμπέρασμα

Εδώ, παρουσιάζουμε μια επισκόπηση του Volatile στην C++ μαζί με τη σύνταξη, τη χρήση και τα κατάλληλα παραδείγματα για καλύτερη κατανόηση. Δεδομένου ότι ο μεταγλωττιστής δεν μπορεί να προβλέψει την τιμή, το volatile είναι ζωτικής σημασίας στον προγραμματισμό C. Το κύριο όφελος από τη χρήση του volatile είναι ότι η τιμή του μπορεί να ποικίλλει κάθε φορά που ένας χρήστης ζητά την τροποποίησή του ή όταν κάποιο άλλο νήμα που χρησιμοποιεί την ίδια μεταβλητή είναι ενεργό.