C++ volatil

C Volatil



„Dezvoltatorii de aplicații pentru spațiul utilizatorului ar trebui să facă întotdeauna referire la manualele relevante ale compilatorului pentru a afla cum poate fi gestionat calificativul în diverse contexte, deoarece comportamentul volatil al cuvintelor cheie ar trebui să fie văzut în mod normal ca dependent de hardware. Atunci când un obiect este marcat ca volatil, compilatorul este adesea informat că nu ar trebui niciodată optimizat pentru operațiunile de încărcare și ar trebui să fie întotdeauna preluat din memoria primară, mai degrabă decât din registre sau cache. Cu toate acestea, atunci când compilatorul încearcă să pună locația memoriei în registru, acesta este memorat automat în cache, chiar dacă există numeroase niveluri de cache care sunt în mare parte indisponibile pentru software și menținute doar în hardware. Ca rezultat, memoria RAM poate fi accesată de multe ori mai rapid din liniile cache din apropierea procesorului decât din locația de memorie identică.

Problemele ar putea apărea dacă nu folosim un calificator volatil care include, atunci când optimizarea este activată, este posibil ca codul să nu funcționeze conform așteptărilor. Când întreruperile sunt utilizate și activate, codul nu poate funcționa așa cum a fost planificat. Datele sunt păstrate în stocare volatilă numai când alimentarea este pornită. Când alimentarea este îndepărtată, are loc pierderea datelor.

Cu toate acestea, stocarea nevolatilă păstrează datele chiar dacă se întrerupe alimentarea. Informațiile de proces sunt stocate pentru scurt timp pe stocarea volatilă, deoarece sunt considerabil mai rapide decât stocarea nevolatilă. Spre deosebire de stocarea nevolatilă, stocarea volatilă este mai potrivită pentru a proteja datele sensibile. Acest lucru se datorează faptului că datele sunt inaccesibile atunci când sursa de alimentare este oprită. Stocarea volatilă costă foarte mult, deoarece sistemele informatice pot găzdui doar câțiva MB până la câțiva GB din el.”







Proprietăți ale calificatorului volatil în C++

Mijloacele de calificare volatilă C++ vor fi demonstrate aici. Când declarăm o variabilă, se aplică calificativul „volatil”. Acesta servește ca un memento pentru compilator că valoarea poate varia în orice moment. Cei volatili posedă unele dintre trăsăturile enumerate mai jos.



• Alocarea memoriei nu poate fi modificată cu cuvântul cheie volatil.



• Variabilele registrului nu pot fi stocate în cache.





• În ceea ce privește atribuirea, valoarea nu poate fi modificată.

Utilizarea calificatorului volatil în C++

1. În ciuda faptului că codul dvs. nu modifică valoarea variabilei, totuși ar putea face acest lucru. Ca urmare, de fiecare dată când compilatorul verifică starea variabilei, nu poate presupune că aceasta este aceeași cu cea mai recentă valoare citită din ea sau cu cea mai recentă valoare stocată; mai degrabă, trebuie să dobândească valoarea variabilei încă o dată.



2. Compilatorul nu este obligat să elimine actul de stocare a unei valori, deoarece este un „efect secundar” care poate fi văzut din exterior și apare atunci când o valoare este salvată într-o variabilă volatilă. De exemplu, dacă două valori sunt plasate pe rând, compilatorul trebuie să pună valoarea de două ori.

Sintaxa calificatorului volatil în C++

# Volatile data_type variable_name

Cuvântul cheie volatil trebuie utilizat în declarație, iar tipul de date se referă la orice tip de date, inclusiv dublu, flotant sau întreg. În cele din urmă, alegem un nume pentru variabilă. Putem defini o variabilă volatilă folosind oricare dintre metode, deoarece ambele declarații sunt valide.

Exemplu: Calificatorul volatil este folosit pentru a identifica obiectele care pot fi modificate de alte fire sau acțiuni exterioare în C++

Dacă obiectul este schimbat printr-un semnal exterior sau printr-o procedură care acționează ca o întrerupere, valoarea modificată trebuie să fie preluată din RAM, deoarece starea stocată în cache nu mai este adecvată între timp. Ca rezultat, compilatorul gestionează în mod corespunzător accesul la obiectele volatile.

#include
#include
#include

folosind std :: cout ;
folosind std :: endl ;
folosind std :: cerr ;
folosind std :: mâncând ;

volatil int secunde = 0 ;

gol Întârziere CinciSecunde ( ) {
in timp ce ( secunde < 3 ) {
tu dormi ( 200000 ) ;
cerr << 'aşteptare...' << endl ;
}
}

gol IncrementSeconds ( ) {
pentru ( int i = 0 ; i < 5 ; ++ i ) {
dormi ( 1 ) ;
cerr << 'incrementat' << endl ;
secunde = secunde + 1 ;
}
}

int principal ( ) {
struct startval time { } ;
struct sfârşitul perioadei de timp { } ;
std :: fir firul 1 ;

firul 1 = std :: fir ( IncrementSeconds ) ;

Întârziere CinciSecunde ( ) ;

firul 1. a te alatura ( ) ;
întoarcere EXIT_SUCCESS ;
}


Pentru a ilustra scenariul potențial, am folosit cuvântul cheie volatil care are variabila declarată ca Secunde de tip de date „int” și i-a atribuit o valoare de 0. Apoi, construim două funcții: una ca „DelayFiveSeconds” care modifică variabila globală întreagă volatilă și alta ca „IncrementSeconds” care efectuează aceeași evaluare în bucla while. Trebuie remarcat faptul că acest exemplu permite buclei while să fie în buclă peste secundele când secundele ar trebui să fie mai mici de 3.

Când condiția este îndeplinită, atunci blocul while va fi executat. În interiorul blocului while, am invocat metoda unsleep care afișează instrucțiunea „în așteptare”. Funcția „IncrementSceonds” are bucla for. După iterație, este invocată metoda sleep, care tipărește declarația „increment” și incrementează variabila „secunde”. Execuția inițială a funcției „IncrementSeconds” se face printr-un fir separat creat de funcția principală. Metoda „DelayFiveSeconds” este apoi apelată de firul principal, intrând într-o buclă care nu se va termina dacă variabila secunde nu se deplasează peste valoarea 5.

De îndată ce firul principal observă că valoarea variabilei secunde s-a schimbat, va reveni din metodă deoarece un alt fir a început deja să o crească simultan.

Pentru a rula codul thread-ului în C++, ar trebui să folosim comanda „g++ -pthread –o filename filename.cc”. Dacă nu implementați „-pthread” în comandă, atunci există o șansă ca o excepție să fie aruncată de compilator. Ca rezultat, am creat efectiv o funcție de așteptare condiționată care așteaptă până când obiectul volatil este schimbat de o forță exterioară. Este important să rețineți că blocul de cod de actualizare poate proveni dintr-o secțiune de traducere diferită sau dintr-o acțiune de semnal extern, chiar dacă acest cod va funcționa în continuare la fel dacă calificativul volatil este eliminat și este utilizată o variabilă globală convențională.

Concluzie

Aici, trecem peste o prezentare generală a Volatile în C++ împreună cu sintaxa, utilizarea și exemplele adecvate pentru o mai bună înțelegere. Deoarece compilatorul nu poate prezice valoarea, volatilul este crucial în programarea C. Avantajul principal al utilizării volatile este că valoarea acestuia poate varia ori de câte ori un utilizator solicită modificarea acestuia sau când este activ un alt fir care utilizează aceeași variabilă.