Flüchtiges C++

Fluchtiges C



„Entwickler von User-Space-Anwendungen sollten immer in den entsprechenden Compiler-Handbüchern nachschlagen, um zu erfahren, wie der Qualifizierer in verschiedenen Kontexten gehandhabt werden kann, da das flüchtige Schlüsselwortverhalten normalerweise als hardwareabhängig angesehen werden sollte. Wenn ein Objekt als flüchtig markiert ist, wird der Compiler oft darüber informiert, dass es niemals für Ladevorgänge optimiert werden sollte und immer aus dem Primärspeicher und nicht aus Registern oder Caches abgerufen werden sollte. Wenn der Compiler jedoch versucht, den Speicherort in das Register einzufügen, wird er automatisch zwischengespeichert, obwohl es zahlreiche Cache-Tiers gibt, die für Software größtenteils nicht verfügbar sind und nur in der Hardware verwaltet werden. Dadurch kann von Cache-Zeilen in der Nähe der CPU um ein Vielfaches schneller auf RAM zugegriffen werden als von der identischen Speicherstelle.

Die Probleme könnten auftreten, wenn wir keinen flüchtigen Qualifizierer verwenden, der beinhaltet, dass der Code bei aktivierter Optimierung möglicherweise nicht wie erwartet funktioniert. Wenn Interrupts verwendet und aktiviert werden, kann der Code nicht wie geplant funktionieren. Daten werden nur im flüchtigen Speicher gehalten, solange das Gerät eingeschaltet ist. Wenn das Netzteil entfernt wird, kommt es zu Datenverlust.

Der nichtflüchtige Speicher hält die Daten jedoch auch dann, wenn der Strom ausfällt. Prozessinformationen werden kurzzeitig auf flüchtigen Speichern gespeichert, da sie erheblich schneller sind als nichtflüchtige Speicher. Im Gegensatz zu nichtflüchtigen Speichern ist flüchtiger Speicher besser geeignet, um sensible Daten zu schützen. Dies liegt daran, dass die Daten nicht zugänglich sind, wenn die Stromversorgung ausgeschaltet ist. Flüchtiger Speicher kostet viel, weil Computersysteme nur wenige MB bis wenige GB davon aufnehmen können.“







Eigenschaften des Volatile Qualifier in C++

Die flüchtigen Qualifizierermittel von C++ werden hier demonstriert. Wenn wir eine Variable deklarieren, wird der Qualifizierer „volatile“ angewendet. Es dient als Erinnerung für den Compiler, dass der Wert jederzeit variieren kann. Die Flüchtigen besitzen einige der unten aufgeführten Eigenschaften.



• Die Speicherbelegung kann nicht mit dem Schlüsselwort volatile geändert werden.



• Die Variablen des Registers können nicht zwischengespeichert werden.





• Bei der Zuordnung kann der Wert nicht verändert werden.

Verwendung des Volatile Qualifier in C++

1. Obwohl Ihr Code den Wert der Variablen nicht ändert, könnte er dies dennoch tun. Infolgedessen kann der Compiler nicht jedes Mal, wenn er den Zustand der Variablen überprüft, davon ausgehen, dass er derselbe ist wie der zuletzt gelesene Wert oder der zuletzt gespeicherte Wert; vielmehr muss er den Wert der Variablen erneut annehmen.



2. Der Compiler muss das Speichern eines Wertes nicht eliminieren, da es sich um einen von außen sichtbaren „Nebeneffekt“ handelt, der auftritt, wenn ein Wert in einer flüchtigen Variablen gespeichert wird. Wenn beispielsweise zwei Werte hintereinander platziert werden, muss der Compiler den Wert zweimal einfügen.

Syntax des Volatile Qualifier in C++

# Flüchtiger Datentyp Variablenname

Das Schlüsselwort volatile muss in der Deklaration verwendet werden, und Datentyp bezieht sich auf jeden Datentyp, einschließlich Double, Float oder Integer. Schließlich wählen wir einen Namen für die Variable. Wir können eine flüchtige Variable mit einer der beiden Methoden definieren, da beide Deklarationen gültig sind.

Beispiel: Der Volatile Qualifier wird verwendet, um Objekte zu identifizieren, die von anderen Threads oder externen Aktionen in C++ geändert werden können

Wird das Objekt durch ein äußeres Signal oder eine als Interrupt wirkende Prozedur verändert, muss der geänderte Wert aus dem RAM geholt werden, da der zwischengespeicherte Zustand zwischenzeitlich nicht mehr passt. Als Ergebnis handhabt der Compiler den Zugriff auf flüchtige Objekte entsprechend.

#include
#include
#include

mit std :: cout ;
mit std :: Ende ;
mit std :: zerr ;
mit std :: Essen ;

flüchtig int Sekunden = 0 ;

Leere VerzögerungFünfSekunden ( ) {
während ( Sekunden < 3 ) {
du schläfst ( 200000 ) ;
zerr << 'warten...' << Ende ;
}
}

Leere IncrementSeconds ( ) {
zum ( int ich = 0 ; ich < 5 ; ++ ich ) {
schlafen ( 1 ) ;
zerr << 'erhöht' << Ende ;
Sekunden = Sekunden + 1 ;
}
}

int hauptsächlich ( ) {
Struktur Zeitbeginn { } ;
Struktur zeitliches Ende { } ;
Standard :: Faden Faden1 ;

Faden1 = Standard :: Faden ( IncrementSeconds ) ;

VerzögerungFünfSekunden ( ) ;

Faden1. beitreten ( ) ;
Rückkehr EXIT_SUCCESS ;
}


Um das mögliche Szenario zu veranschaulichen, haben wir das Schlüsselwort volatile verwendet, dessen Variable als Sekunden vom Datentyp „int“ deklariert ist, und ihm den Wert 0 zugewiesen. Dann konstruieren wir zwei Funktionen: eine als „DelayFiveSeconds“, die die globale flüchtige Integer-Variable ändert, und eine andere als „IncrementSeconds“, die dieselbe Auswertung innerhalb der While-Schleife durchführt. Es sollte beachtet werden, dass dieses Beispiel erlaubt, dass die While-Schleife über die Sekunden geschleift wird, wenn die Sekunden kleiner als 3 sein sollten.

Wenn die Bedingung erfüllt ist, wird der While-Block ausgeführt. Innerhalb des while-Blocks haben wir die unsleep-Methode aufgerufen, die die Anweisung „waiting“ ausgibt. Die Funktion „IncrementSceonds“ hat die for-Schleife. Nach der Iteration wird die sleep-Methode aufgerufen, die die Anweisung „increment“ ausgibt und die Variable „seconds“ erhöht. Die anfängliche Ausführung der Funktion „IncrementSeconds“ erfolgt durch einen separaten Thread, der von der Hauptfunktion erstellt wird. Die „DelayFiveSeconds“-Methode wird dann vom Hauptthread aufgerufen und tritt in eine Schleife ein, die nicht endet, wenn die Sekundenvariable den Wert 5 nicht überschreitet.

Sobald der Haupt-Thread bemerkt, dass sich der Wert der Sekundenvariablen geändert hat, kehrt er von der Methode zurück, weil ein anderer Thread bereits damit begonnen hat, ihn gleichzeitig zu erhöhen.

Um den Thread-Code in C++ auszuführen, sollten wir den Befehl „g++ -pthread –o filename filename.cc“ verwenden. Wenn Sie „-pthread“ nicht im Befehl bereitstellen, besteht die Möglichkeit, dass der Compiler eine Ausnahme auslöst. Als Ergebnis haben wir effektiv eine bedingte Wartefunktion erstellt, die wartet, bis das flüchtige Objekt durch eine äußere Kraft geändert wird. Es ist wichtig, daran zu denken, dass der Aktualisierungscodeblock aus einem anderen Übersetzungsabschnitt oder einer externen Signalaktion stammen könnte, obwohl dieser Code immer noch gleich funktioniert, wenn der flüchtige Qualifizierer entfernt und eine herkömmliche globale Variable verwendet wird.

Fazit

Hier geben wir einen Überblick über Volatile in C++ zusammen mit Syntax, Verwendung und geeigneten Beispielen zum besseren Verständnis. Da der Compiler den Wert nicht vorhersagen kann, ist volatile in der C-Programmierung von entscheidender Bedeutung. Der Hauptvorteil der Verwendung von flüchtig besteht darin, dass sein Wert variieren kann, wenn ein Benutzer eine Änderung anfordert oder wenn ein anderer Thread, der dieselbe Variable verwendet, aktiv ist.