Волатиле Ц++

Volatile C



„Програмери апликација у корисничком простору увек би требало да упућују на релевантне приручнике за компајлер да би сазнали како се квалификатором може руковати у различитим контекстима јер би понашање променљиве кључне речи нормално требало да се посматра као зависно од хардвера. Када је објекат означен као променљив, компајлер се често обавештава да никада не треба да буде оптимизован за операције учитавања и да га увек треба преузимати из примарне меморије, а не из регистара или кеша. Међутим, када преводилац покуша да стави меморијску локацију у регистар, она се аутоматски кешује иако постоје бројни нивои кеша који су углавном недоступни софтверу и одржавају се само у хардверу. Као резултат тога, РАМ-у се може приступити много пута брже из кеш линија у близини ЦПУ-а него са идентичне меморијске локације.

Проблеми би могли да настану ако не користимо променљиви квалификатор који укључује, када је омогућена оптимизација, код можда неће функционисати како се очекује. Када се прекиди искористе и омогуће, код не може да функционише како је планирано. Подаци се задржавају само у нестабилном складишту док је напајање укључено. Када се напајање уклони, долази до губитка података.

Међутим, непроменљиво складиште чува податке чак и ако нестане струје. Информације о процесу се накратко чувају у нестабилном складишту пошто је знатно брже од непроменљивог складишта. За разлику од непроменљивог складиштења, променљиво складиште је погодније за заштиту осетљивих података. То је зато што су подаци недоступни када је напајање искључено. Нестално складиштење кошта много јер рачунарски системи могу да приме само неколико МБ до неколико ГБ тога.”







Особине квалификатора волатиле у Ц++

Овде ће бити демонстрирано значење Ц++ квалификатора волатиле. Када декларишемо променљиву, примењује се квалификатор „волатиле“. Он служи као подсетник компајлеру да се вредност може променити у било ком тренутку. Нестабилни поседују неке од доле наведених особина.



• Додељивање меморије се не може променити помоћу кључне речи волатиле.



• Променљиве регистра се не могу кеширати.





• У смислу доделе, вредност се не може мењати.

Употреба квалификатора Волатиле у Ц++

1. Иако ваш код не мења вредност променљиве, ипак може то да уради. Као резултат, сваки пут када преводилац проверава стање променљиве, не може претпоставити да је оно исто као најскорија вредност прочитана из ње или најновија сачувана вредност; него мора још једном стећи вредност променљиве.



2. Од компајлера се не захтева да елиминише чин чувања вредности јер је то „нуспојава“ која се може видети споља и јавља се када је вредност сачувана у променљивој променљивој. На пример, ако су две вредности постављене у низу, компајлер мора да стави вредност два пута.

Синтакса квалификатора Волатиле у Ц++

# Променљиво име_променљиве типа података

Кључна реч волатиле мора да се користи у декларацији, а тип података се односи на било који тип података, укључујући дупли, флоат или цео број. На крају, бирамо име за променљиву. Можемо да дефинишемо променљиву променљиву користећи било који од метода пошто су обе декларације важеће.

Пример: Квалификатор Волатиле се користи за идентификацију објеката који могу бити измењени другим нитима или спољним радњама у Ц++

Ако је објекат промењен спољним сигналом или процедуром која делује као прекид, измењена вредност треба да се преузме из РАМ меморије јер кеширано стање у међувремену више није одговарајуће. Као резултат, компајлер на одговарајући начин рукује приступом променљивим објектима.

#инцлуде <иостреам>
#инцлуде <унистд.х>
#инцлуде <нит>

користећи стд :: цоут ;
користећи стд :: ендл ;
користећи стд :: церр ;
користећи стд :: једење ;

несталан инт секунди = 0 ;

празнина ДелаиФивеСецондс ( ) {
док ( секунди < 3 ) {
услееп ( 200000 ) ;
церр << 'чекајући...' << ендл ;
}
}

празнина ИнцрементСецондс ( ) {
за ( инт и = 0 ; и < 5 ; ++ и ) {
спавати ( 1 ) ;
церр << 'повећан' << ендл ;
секунди = секунди + 1 ;
}
}

инт главни ( ) {
струцт временски почетак { } ;
струцт временски крај { } ;
стд :: конац тхреад1 ;

тхреад1 = стд :: конац ( ИнцрементСецондс ) ;

ДелаиФивеСецондс ( ) ;

тхреад1. придружити ( ) ;
повратак ЕКСИТ_СУЦЦЕСС ;
}


Да бисмо илустровали потенцијални сценарио, користили смо кључну реч волатиле која има променљиву декларисану као секунде типа података „инт“ и доделили јој вредност 0. Затим конструишемо две функције: једну као „ДелаиФивеСецондс“ која мења глобалну променљиву целобројну променљиву, а другу као „ИнцрементСецондс“ која врши исту евалуацију унутар вхиле петље. Треба напоменути да овај пример дозвољава петљи вхиле да се окреће кроз секунде када би секунде требало да буду мање од 3.

Када се услов испуни, тада ће се извршити блок вхиле. Унутар блока вхиле, позвали смо методу унслееп која штампа изјаву „ваитинг“. Функција „ИнцрементСцеондс“ има петљу фор. Након итерације, позива се метода спавања, која штампа наредбу „инцремент“ и повећава променљиву „сецондс“. Иницијално извршавање функције „ИнцрементСецондс“ врши посебна нит коју креира главна функција. Методу „ДелаиФивеСецондс“ затим позива главна нит, улазећи у петљу која се неће завршити ако се променљива сецондс не помери изнад вредности од 5.

Чим главна нит примети да се вредност променљиве секунде променила, вратиће се из методе јер је друга нит већ почела да је повећава истовремено.

Да бисмо покренули код нити у Ц++, требало би да користимо команду „г++ -птхреад –о име датотеке име датотеке.цц“. Ако не примените „-птхреад“ у команди, постоји шанса да компајлер избаци изузетак. Као резултат тога, ми смо ефективно направили функцију условног чекања која чека док се променљиви објекат не промени спољном силом. Важно је имати на уму да блок кода за ажурирање може доћи из другог одељка за превођење или екстерне сигналне акције, иако ће овај код и даље функционисати исто ако се уклони квалификатор за променљиве и користи се конвенционална глобална променљива.

Закључак

Овде прелазимо на преглед Волатиле у Ц++ заједно са синтаксом, употребом и одговарајућим примерима за боље разумевање. Пошто компајлер не може да предвиди вредност, волатиле је кључан у Ц програмирању. Примарна предност коришћења променљиве је та што њена вредност може да варира кад год корисник захтева да се она измени или када је активна нека друга нит која користи исту променљиву.