Nestalni C++

Nestalni C



„Programeri aplikacija u korisničkom prostoru uvijek bi se trebali pozivati ​​na relevantne priručnike za prevoditelje kako bi naučili kako se s kvalifikatorom može rukovati u različitim kontekstima jer bi se nestabilno ponašanje ključne riječi obično trebalo promatrati kao ovisno o hardveru. Kada je objekt označen kao nepostojan, prevodilac je često obaviješten da ga nikada ne treba optimizirati za operacije učitavanja i da ga uvijek treba dohvaćati iz primarne memorije, a ne iz registara ili predmemorije. Međutim, kada kompajler pokuša staviti memorijsku lokaciju u registar, ona se automatski sprema u predmemoriju iako postoje brojne razine predmemorija koje su uglavnom nedostupne softveru i održavaju se samo u hardveru. Kao rezultat toga, RAM-u se može mnogo puta brže pristupiti iz linija predmemorije u blizini CPU-a nego s identične memorijske lokacije.

Problemi bi se mogli pojaviti ako ne koristimo nepostojani kvalifikator koji uključuje, kada je optimizacija omogućena, kôd možda neće funkcionirati kako se očekuje. Kada se prekidi iskoriste i omoguće, kôd ne može funkcionirati prema planu. Podaci se zadržavaju u hlapljivoj pohrani samo dok je napajanje uključeno. Kada se napajanje ukloni, dolazi do gubitka podataka.

Međutim, trajna pohrana čuva podatke čak i ako nestane struje. Podaci o procesu se nakratko pohranjuju u hlapljivu pohranu budući da je znatno brža od stalne pohrane. Za razliku od postojane pohrane, nepostojana pohrana je prikladnija za zaštitu osjetljivih podataka. To je zato što su podaci nedostupni kada je napajanje isključeno. Hlapljiva pohrana košta puno jer računalni sustavi mogu primiti samo nekoliko MB do nekoliko GB.'







Svojstva kvalifikatora volatile u C++

Ovdje će se demonstrirati C++ volatile kvalifikator. Kada deklariramo varijablu, primjenjuje se kvalifikator 'volatile'. Služi kao podsjetnik kompajleru da vrijednost može varirati u bilo kojem trenutku. Hlapljivi posjeduju neke od dolje navedenih osobina.



• Dodjela memorije ne može se promijeniti ključnom riječi volatile.



• Varijable registra nije moguće predmemorirati.





• Što se tiče dodjele, vrijednost se ne može mijenjati.

Upotreba kvalifikatora volatile u C++

1. Unatoč tome što vaš kod ne mijenja vrijednost varijable, ipak bi to mogao učiniti. Kao rezultat toga, svaki put kad prevodilac provjerava stanje varijable, ne može pretpostaviti da je ista kao posljednja vrijednost pročitana iz nje ili posljednja pohranjena vrijednost; nego mora još jednom dobiti vrijednost varijable.



2. Kompajler nije dužan eliminirati radnju pohranjivanja vrijednosti budući da je to 'nuspojava' koja se može vidjeti izvana i javlja se kada se vrijednost sprema u promjenljivu varijablu. Na primjer, ako su dvije vrijednosti postavljene u nizu, prevodilac mora staviti vrijednost dva puta.

Sintaksa kvalifikatora volatile u C++

# Ime varijable tipa nestabilnih podataka

Ključna riječ volatile mora se koristiti u deklaraciji, a tip podataka odnosi se na bilo koji tip podataka, uključujući double, float ili integer. Na kraju biramo ime za varijablu. Možemo definirati volatilnu varijablu koristeći bilo koju od metoda budući da su obje deklaracije važeće.

Primjer: kvalifikator volatile koristi se za identifikaciju objekata koji se mogu modificirati drugim nitima ili vanjskim radnjama u C++

Ako je objekt promijenjen vanjskim signalom ili procedurom koja djeluje kao prekid, promijenjenu vrijednost treba dohvatiti iz RAM-a jer stanje u predmemoriji u međuvremenu više nije prikladno. Kao rezultat toga, kompajler na odgovarajući način rukuje pristupom nepostojanim objektima.

#include
#include
#include

pomoću std :: cout ;
pomoću std :: endl ;
pomoću std :: cerr ;
pomoću std :: jelo ;

nepostojan int sekundi = 0 ;

poništiti Odgodi pet sekundi ( ) {
dok ( sekundi < 3 ) {
naspavati se ( 200 000 ) ;
cerr << 'čekanje...' << endl ;
}
}

poništiti IncrementSeconds ( ) {
za ( int ja = 0 ; ja < 5 ; ++ ja ) {
spavati ( 1 ) ;
cerr << 'povećano' << endl ;
sekundi = sekundi + 1 ;
}
}

int glavni ( ) {
strukturirati vremenski početak { } ;
strukturirati vremenski kraj { } ;
std :: nit nit1 ;

nit1 = std :: nit ( IncrementSeconds ) ;

Odgodi pet sekundi ( ) ;

nit1. pridružiti ( ) ;
povratak IZLAZ_USPJEH ;
}


Kako bismo ilustrirali potencijalni scenarij, upotrijebili smo ključnu riječ volatile koja ima varijablu deklariranu kao sekunde tipa podataka 'int' i dodijelili joj vrijednost 0. Zatim konstruiramo dvije funkcije: jednu kao 'DelayFiveSeconds' koja mijenja globalnu promjenjivu varijablu cijelog broja, a drugu kao 'IncrementSeconds' koja izvodi istu procjenu unutar while petlje. Treba imati na umu da ovaj primjer dopušta petlju while da prelazi preko sekundi kada bi sekunde trebale biti manje od 3.

Kada se uvjet ispuni, tada će biti izvršen blok while. Unutar while bloka pozvali smo metodu unsleep koja ispisuje naredbu 'čekanje'. Funkcija 'IncrementSceonds' ima for petlju. Nakon iteracije, poziva se metoda spavanja, koja ispisuje naredbu “increment” i povećava varijablu “seconds”. Početno izvršavanje funkcije 'IncrementSeconds' obavlja zasebna nit koju je stvorila glavna funkcija. Metoda 'DelayFiveSeconds' tada se poziva od strane glavne niti, ulazeći u petlju koja neće završiti ako se varijabla sekundi ne pomakne iznad vrijednosti 5.

Čim glavna nit primijeti da se vrijednost sekundarne varijable promijenila, vratit će se iz metode jer ju je druga nit već počela istovremeno povećavati.

Za pokretanje koda niti u C++-u, trebali bismo koristiti naredbu “g++ -pthread –o filenamefilename.cc”. Ako ne implementirate '-pthread' u naredbi, postoji mogućnost da kompajler izbaci iznimku. Kao rezultat toga, učinkovito smo napravili funkciju uvjetnog čekanja koja čeka dok se nepostojani objekt promijeni vanjskom silom. Važno je imati na umu da bi blok koda za ažuriranje mogao doći iz drugog odjeljka prijevoda ili radnje vanjskog signala, iako će ovaj kod i dalje funkcionirati isto ako se kvalifikator volatile ukloni i ako se koristi konvencionalna globalna varijabla.

Zaključak

Ovdje ćemo pregledati Volatile u C++ zajedno sa sintaksom, upotrebom i odgovarajućim primjerima za bolje razumijevanje. Budući da kompajler ne može predvidjeti vrijednost, volatile je ključan u C programiranju. Primarna prednost korištenja volatile je da se njegova vrijednost može razlikovati svaki put kada korisnik zatraži da se izmijeni ili kada je neka druga nit koja koristi istu varijablu aktivna.