Flyktig C ++

Flyktig C ++
“Utviklere av bruker-rom-applikasjoner bør alltid referere til de relevante kompilatorhåndbøkene for å lære hvordan kvalifiseringen kan håndteres i forskjellige sammenhenger fordi den flyktige nøkkelordatferden normalt skal sees som maskinvareavhengig. Når et objekt er merket som flyktig, blir kompilatoren ofte informert om at den aldri skal optimaliseres for belastningsoperasjoner og bør alltid hentes fra primærminne i stedet for registre eller hurtigbuffer. Imidlertid, når kompilatoren prøver å sette minnestedet inn i registeret, blir det automatisk hurtigbufret selv om det er mange lag med hurtigbuffer som stort sett ikke er tilgjengelige for programvare og bare opprettholdes i maskinvaren. Som et resultat kan RAM nås mange ganger raskere fra hurtigbufferlinjer i nærheten av CPU enn fra det identiske minneplassen.

Problemene kan oppstå hvis vi ikke bruker en flyktig kvalifisering som inkluderer, når optimalisering er aktivert, kan det hende at koden ikke fungerer som forventet. Når avbrudd brukes og aktiveres, kan ikke koden fungere som planlagt. Data beholdes bare i flyktig lagring mens strømmen er på. Når tilbudet fjernes, skjer tap av data.

Imidlertid holder ikke-flyktig lagring data selv om strømmen går ut. Prosessinformasjon lagres kort på flyktig lagring siden den er betydelig raskere enn ikke-flyktig lagring. I motsetning til ikke-flyktig lagring, er flyktig lagring mer egnet til å ivareta sensitive data. Dette er fordi dataene er utilgjengelig når strømforsyningen er slått av. Flyktig lagring koster mye fordi datasystemer bare har plass til noen få MB til noen få GB av det.”

Egenskaper til den flyktige kvalifiseringen i C++

C ++ ustabile kvalifiseringsmidler vil bli demonstrert her. Når vi erklærer en variabel, blir kvalifiseringen "flyktig" brukt. Det fungerer som en påminnelse for kompilatoren om at verdien er ansvarlig for å variere når som helst. Den flyktige har noen av egenskapene som er oppført nedenfor.

• Minneoppgaven kan ikke endres med det flyktige nøkkelordet.

• Registerets variabler kan ikke bufres.

• Når det gjelder tildeling, kan ikke verdien endres.

Bruk av den flyktige kvalifiseringen i C++

1. Til tross for at koden din ikke endrer variabelenes verdi, kan den likevel gjøre det. Som et resultat, hver gang kompilatoren sjekker tilstanden til variabelen, kan den ikke anta at den er den samme som den nyeste verdien som er lest fra den eller den nyeste verdien som er lagret; snarere må den skaffe verdien av variabelen en gang til.

2. Kompilatoren er ikke pålagt å eliminere handlingen med å lagre en verdi siden det er en "bivirkning" som kan sees utenfra og oppstår når en verdi lagres i en flyktig variabel. For eksempel, hvis to verdier er plassert på rad, må kompilatoren sette verdien to ganger.

Syntaks av den flyktige kvalifiseringen i C++

# Volatile Data_Type Variable_name

Det flyktige nøkkelordet må brukes i erklæringen, og datatype refererer til hvilken som helst datatype, inkludert dobbel, float eller heltall. Til slutt velger vi et navn for variabelen. Vi kan definere en flyktig variabel ved hjelp av en av metodene siden begge erklæringer er gyldige.

Eksempel: Den flyktige kvalifiseringen brukes til å identifisere objekter som kan modifiseres av andre tråder eller utvendige handlinger i C++

Hvis objektet endres av et utvendig signal eller en prosedyre som fungerer som et avbrudd, må den endrede verdien hentes fra RAM fordi den hurtigbufret tilstanden ikke lenger er passende i mellomtiden. Som et resultat håndterer kompilatoren tilgang til flyktige objekter på riktig måte.

#inkludere
#inkludere
#inkludere
bruker std :: cout;
bruker std :: endl;
bruker std :: cerr;
bruker std :: cin;
flyktige int sekunder = 0;
void DelayFiveSeconds ()
mens (sekunder < 3)
Usleep (200000);
Cerr<< "waiting… " <

ugyldig trinnsekunder ()
for (int i = 0; i< 5; ++i)
søvn (1);
Cerr<< "incremented " <sekunder = sekunder + 1;


int main ()
struktur Tideval start ;
struct TimeVal End ;
std :: tråd tråd1;
tråd1 = std :: tråd (trinnstilmer);
DelayFiveSeconds ();
Tråd1.bli med();
return exit_success;


For å illustrere det potensielle scenariet, har vi brukt det flyktige søkeordet som har variabelen erklært som sekunder med datatype “int” og tildelt en verdi på 0 til den. Deretter konstruerer vi to funksjoner: en som "DelayFiveSeconds" som endrer den globale flyktige heltallsvariabelen, og en annen som "trinnskader" som utfører den samme evalueringen i While Loop. Det skal bemerkes at dette eksemplet tillater at mens Loop har sløyfet i løpet av sekundene når sekundene skal være mindre enn 3.

Når tilstanden møtes, vil mens blokken blir utført. Inne i stundblokken har vi påkalt den uslevede metoden som skriver ut uttalelsen "Waiting". "Trinn. Etter iterasjonen påberopes søvnmetoden, som skriver ut uttalelsen "økning" og trinn. Opprinnelig utførelse av "trinnvidder" -funksjonen gjøres av en egen tråd opprettet av hovedfunksjonen. Metoden "DelayFiveSeconds" blir deretter kalt av hovedtråden, og går inn i en sløyfe som ikke vil ende hvis sekundvariabelen ikke beveger seg over verdien av 5.

Så snart hovedtråden merker at sekundvariabelen har endret seg, vil den komme tilbake fra metoden fordi en annen tråd allerede har begynt å øke den samtidig.

For å kjøre trådkoden i C ++, bør vi bruke kommandoen “G ++ -Pthread -o filnavn filnavn.CC ”. Hvis du ikke distribuerer "-pthread" i kommandoen, er det en sjanse for at et unntak blir kastet av kompilatoren. Som et resultat laget vi effektivt en betinget ventefunksjon som venter til det flyktige objektet endres av en ytre kraft. Det er viktig å huske på at oppdateringskodeblokken kan komme fra en annen oversettelsesdel eller ekstern signalhandling, selv om denne koden fremdeles vil fungere den samme hvis den flyktige kvalifiseringen er fjernet og en konvensjonell global variabel blir brukt.

Konklusjon

Her går vi over en oversikt over flyktige i C ++ sammen med syntaks, bruk og passende eksempler for en bedre forståelse. Siden kompilatoren ikke kan forutsi verdien, er flyktig avgjørende for C -programmering. Den primære fordelen med å bruke ustabil er at verdien kan variere når en bruker ber om at den skal endres eller når en annen tråd som bruker den samme variabelen er aktiv.