Prchavé C++

Prchave C



„Vývojári aplikácií v užívateľskom priestore by sa mali vždy odvolávať na príslušné príručky kompilátora, aby sa dozvedeli, ako možno s kvalifikátorom narábať v rôznych kontextoch, pretože správanie prchavých kľúčových slov by sa malo normálne považovať za závislé od hardvéru. Keď je objekt označený ako nestály, kompilátor je často informovaný o tom, že by nikdy nemal byť optimalizovaný na operácie načítania a vždy by sa mal načítať z primárnej pamäte a nie z registrov alebo vyrovnávacej pamäte. Keď sa však kompilátor pokúsi vložiť pamäťové miesto do registra, automaticky sa uloží do vyrovnávacej pamäte, aj keď existuje množstvo úrovní vyrovnávacích pamätí, ktoré sú z veľkej časti nedostupné pre softvér a udržiavané iba v hardvéri. Výsledkom je, že k RAM je možné pristupovať mnohonásobne rýchlejšie z vyrovnávacej pamäte v blízkosti procesora ako z rovnakého miesta v pamäti.

Problémy sa môžu vyskytnúť, ak nepoužijeme volatilný kvalifikátor, ktorý zahŕňa, že keď je povolená optimalizácia, kód nemusí fungovať podľa očakávania. Keď sú prerušenia využívané a povolené, kód nemôže fungovať podľa plánu. Dáta sa uchovávajú iba v nestálom úložisku, keď je zapnuté napájanie. Po odstránení spotrebného materiálu dôjde k strate údajov.

Energeticky nezávislé úložisko však uchováva dáta aj po výpadku napájania. Informácie o procese sú krátkodobo uložené v energeticky závislom úložisku, pretože je podstatne rýchlejšie ako energeticky nezávislé úložisko. Na rozdiel od energeticky nezávislého úložiska je volatilné úložisko vhodnejšie na ochranu citlivých údajov. Dáta sú totiž pri vypnutom napájaní nedostupné. Nestále úložisko stojí veľa, pretože počítačové systémy dokážu pojať len niekoľko MB až niekoľko GB.“







Vlastnosti Volatile Qualifier v C++

Tu budú demonštrované prostriedky volatilného kvalifikátora C++. Keď deklarujeme premennú, použije sa kvalifikátor „volatile“. Slúži ako pripomienka pre kompilátor, že hodnota sa môže kedykoľvek meniť. Prchavé majú niektoré z vlastností uvedených nižšie.



• Priradenie pamäte nie je možné zmeniť pomocou nestáleho kľúčového slova.



• Premenné registra nemožno uložiť do vyrovnávacej pamäte.





• Z hľadiska priradenia nie je možné meniť hodnotu.

Použitie volatilného kvalifikátora v C++

1. Napriek tomu, že váš kód nemení hodnotu premennej, môže tak urobiť. Výsledkom je, že zakaždým, keď kompilátor kontroluje stav premennej, nemôže predpokladať, že je rovnaká ako najnovšia hodnota z nej načítaná alebo posledná uložená hodnota; skôr musí nadobudnúť hodnotu premennej ešte raz.



2. Od kompilátora sa nevyžaduje, aby eliminoval akt ukladania hodnoty, pretože je to „vedľajší efekt“, ktorý je viditeľný zvonku a vyskytuje sa, keď je hodnota uložená v nestálej premennej. Napríklad, ak sú dve hodnoty umiestnené v rade, kompilátor musí zadať hodnotu dvakrát.

Syntax Volatile Qualifier v C++

# Volatile data_type variable_name

V deklarácii sa musí použiť nestále kľúčové slovo a dátový typ sa vzťahuje na akýkoľvek dátový typ vrátane double, float alebo integer. Nakoniec zvolíme názov premennej. Prchavú premennú môžeme definovať pomocou jednej z metód, pretože obe deklarácie sú platné.

Príklad: Volatile Qualifier sa používa na identifikáciu objektov, ktoré môžu byť modifikované inými vláknami alebo vonkajšími akciami v C++

Ak je objekt zmenený vonkajším signálom alebo procedúrou, ktorá funguje ako prerušenie, zmenenú hodnotu je potrebné získať z pamäte RAM, pretože medzičasom už nie je vhodný stav vyrovnávacej pamäte. Výsledkom je, že kompilátor primerane spracováva prístup k nestálym objektom.

#include
#include
#include

pomocou std :: cout ;
pomocou std :: endl ;
pomocou std :: cerr ;
pomocou std :: jedenie ;

nestály int sekúnd = 0 ;

neplatné DelayFiveSeconds ( ) {
zatiaľ čo ( sekúnd < 3 ) {
spať ( 200 000 ) ;
cerr << 'čakanie...' << endl ;
}
}

neplatné IncrementSeconds ( ) {
pre ( int i = 0 ; i < 5 ; ++ i ) {
spať ( 1 ) ;
cerr << 'zvýšený' << endl ;
sekúnd = sekúnd + 1 ;
}
}

int hlavné ( ) {
štrukturovať časový štart { } ;
štrukturovať časový koniec { } ;
std :: niť vlákno1 ;

vlákno1 = std :: niť ( IncrementSeconds ) ;

DelayFiveSeconds ( ) ;

vlákno1. pripojiť sa ( ) ;
vrátiť EXIT_SUCCESS ;
}


Na ilustráciu potenciálneho scenára sme použili nestále kľúčové slovo, ktoré má premennú deklarovanú ako sekundy dátového typu „int“ a priradili sme jej hodnotu 0. Potom vytvoríme dve funkcie: jednu ako „DelayFiveSeconds“, ktorá mení globálnu nestálu celočíselnú premennú, a druhú ako „IncrementSeconds“, ktorá vykonáva rovnaké vyhodnotenie v rámci cyklu while. Je potrebné poznamenať, že tento príklad umožňuje slučke while cyklovať niekoľko sekúnd, keď by sekundy mali byť menšie ako 3.

Keď je podmienka splnená, vykoná sa blok while. Vo vnútri bloku while sme vyvolali metódu unsleep, ktorá vypíše príkaz „čakanie“. Funkcia „IncrementSceonds“ má cyklus for. Po iterácii sa vyvolá metóda spánku, ktorá vypíše príkaz „increment“ a zvýši premennú „seconds“. Počiatočné spustenie funkcie „IncrementSeconds“ sa vykonáva pomocou samostatného vlákna vytvoreného hlavnou funkciou. Metóda „DelayFiveSeconds“ je potom vyvolaná hlavným vláknom a vstupuje do cyklu, ktorý sa neskončí, ak sa premenná sekúnd neposunie nad hodnotu 5.

Akonáhle si hlavné vlákno všimne, že hodnota sekundovej premennej sa zmenila, vráti sa z metódy, pretože iné vlákno ju už začalo súbežne zvyšovať.

Na spustenie kódu vlákna v C++ by sme mali použiť príkaz „g++ -pthread –o filename.cc“. Ak v príkaze nenasadíte „-pthread“, potom existuje šanca, že kompilátor vyvolá výnimku. V dôsledku toho sme efektívne vytvorili funkciu podmieneného čakania, ktorá čaká, kým sa prchavý objekt nezmení vonkajšou silou. Je dôležité mať na pamäti, že blok aktualizačného kódu môže pochádzať z inej sekcie prekladu alebo akcie externého signálu, aj keď tento kód bude stále fungovať rovnako, ak sa odstráni volatile kvalifikátor a použije sa konvenčná globálna premenná.

Záver

Tu si prejdeme prehľad Volatile v C++ spolu so syntaxou, použitím a vhodnými príkladmi pre lepšie pochopenie. Keďže kompilátor nemôže predpovedať hodnotu, volatile je pri programovaní v C kľúčová. Primárnou výhodou použitia volatile je, že jej hodnota sa môže meniť vždy, keď používateľ požiada o jej úpravu, alebo keď je aktívne nejaké iné vlákno využívajúce rovnakú premennú.