C++ volatil

C Volatil



« Les développeurs d'applications en espace utilisateur doivent toujours se référer aux manuels de compilateur pertinents pour savoir comment le qualificatif peut être géré dans divers contextes, car le comportement des mots clés volatils doit normalement être considéré comme dépendant du matériel. Lorsqu'un objet est marqué comme volatile, le compilateur est souvent informé qu'il ne doit jamais être optimisé pour les opérations de chargement et qu'il doit toujours être extrait de la mémoire principale plutôt que des registres ou des caches. Cependant, lorsque le compilateur essaie de mettre l'emplacement de la mémoire dans le registre, il est automatiquement mis en cache même s'il existe de nombreux niveaux de caches qui sont largement indisponibles pour les logiciels et uniquement conservés dans le matériel. En conséquence, la RAM est accessible beaucoup plus rapidement à partir des lignes de cache proches du CPU qu'à partir de l'emplacement de mémoire identique.

Les problèmes peuvent survenir si nous n'utilisons pas un qualificatif volatil qui inclut, lorsque l'optimisation est activée, le code peut ne pas fonctionner comme prévu. Lorsque les interruptions sont utilisées et activées, le code ne peut pas fonctionner comme prévu. Les données ne sont conservées dans un stockage volatile que lorsque l'appareil est sous tension. Lorsque l'alimentation est supprimée, une perte de données se produit.

Cependant, le stockage non volatile conserve les données même en cas de panne de courant. Les informations de processus sont brièvement stockées sur un stockage volatil car il est considérablement plus rapide que le stockage non volatil. Contrairement au stockage non volatile, le stockage volatile est plus adapté pour protéger les données sensibles. En effet, les données sont inaccessibles lorsque l'alimentation est coupée. Le stockage volatil coûte cher car les systèmes informatiques ne peuvent en accueillir que quelques Mo à quelques Go. »







Propriétés du qualificateur volatil en C++

Les moyens de qualification volatile C++ seront démontrés ici. Lorsque nous déclarons une variable, le qualificatif 'volatile' est appliqué. Il sert à rappeler au compilateur que la valeur est susceptible de varier à tout moment. Les volatiles possèdent certains des traits énumérés ci-dessous.



• L'affectation de la mémoire ne peut pas être modifiée avec le mot-clé volatile.



• Les variables du registre ne peuvent pas être mises en cache.





• En termes d'affectation, la valeur ne peut pas être modifiée.

Utilisation du qualificateur volatil en C++

1. Bien que votre code ne modifie pas la valeur de la variable, il peut néanmoins le faire. Par conséquent, chaque fois que le compilateur vérifie l'état de la variable, il ne peut pas supposer qu'il est identique à la valeur la plus récente lue à partir de celle-ci ou à la valeur la plus récente stockée ; il doit plutôt acquérir la valeur de la variable une fois de plus.



2. Le compilateur n'est pas obligé d'éliminer l'acte de stocker une valeur puisqu'il s'agit d'un « effet secondaire » qui peut être vu de l'extérieur et qui se produit lorsqu'une valeur est enregistrée dans une variable volatile. Par exemple, si deux valeurs sont placées dans une ligne, le compilateur doit mettre la valeur deux fois.

Syntaxe du qualificateur volatil en C++

# type_données volatile nom_variable

Le mot clé volatile doit être utilisé dans la déclaration et le type de données fait référence à tout type de données, y compris double, flottant ou entier. Enfin, nous choisissons un nom pour la variable. Nous pouvons définir une variable volatile en utilisant l'une ou l'autre des méthodes puisque les deux déclarations sont valides.

Exemple : le qualificateur volatil est utilisé pour identifier les objets qui peuvent être modifiés par d'autres threads ou des actions extérieures en C++

Si l'objet est modifié par un signal extérieur ou une procédure qui agit comme une interruption, la valeur modifiée doit être récupérée de la RAM car l'état du cache n'est plus approprié entre-temps. Par conséquent, le compilateur gère l'accès aux objets volatiles de manière appropriée.

#include
#include
#include

en utilisant std :: écoute ;
en utilisant std :: fin ;
en utilisant std :: cerr ;
en utilisant std :: en mangeant ;

volatil entier secondes = 0 ;

annuler DelayFiveSeconds ( ) {
tandis que ( secondes < 3 ) {
tu dors ( 200000 ) ;
cerr << 'attendre...' << fin ;
}
}

annuler IncrementSeconds ( ) {
pour ( entier je = 0 ; je < 5 ; ++ je ) {
dormir ( 1 ) ;
cerr << 'incrémenté' << fin ;
secondes = secondes + 1 ;
}
}

entier principale ( ) {
structure début de timeval { } ;
structure fin de la période { } ;
std :: fil de discussion fil1 ;

fil1 = std :: fil de discussion ( IncrementSeconds ) ;

DelayFiveSeconds ( ) ;

fil1. rejoindre ( ) ;
revenir EXIT_SUCCESS ;
}


Pour illustrer le scénario potentiel, nous avons utilisé le mot-clé volatile qui a la variable déclarée comme Seconds de type de données « int » et lui a attribué une valeur de 0. Ensuite, nous construisons deux fonctions : une en tant que 'DelayFiveSeconds' qui modifie la variable entière volatile globale, et une autre en tant que 'IncrementSeconds' qui effectue la même évaluation à l'intérieur de la boucle while. Il convient de noter que cet exemple permet à la boucle while d'avoir bouclé sur les secondes alors que les secondes devraient être inférieures à 3.

Lorsque la condition est remplie, le bloc while sera exécuté. À l'intérieur du bloc while, nous avons invoqué la méthode unsleep qui imprime l'instruction 'waiting'. La fonction 'IncrementSceonds' a la boucle for. Après l'itération, la méthode sleep est invoquée, qui imprime l'instruction 'incrément' et incrémente la variable 'secondes'. L'exécution initiale de la fonction 'IncrementSeconds' est effectuée par un thread séparé créé par la fonction principale. La méthode 'DelayFiveSeconds' est alors appelée par le thread principal, entrant dans une boucle qui ne se terminera pas si la variable secondes ne dépasse pas la valeur de 5.

Dès que le thread principal remarque que la valeur de la variable secondes a changé, il reviendra de la méthode car un autre thread a déjà commencé à l'augmenter simultanément.

Pour exécuter le code du thread en C++, nous devons utiliser la commande « g++ -pthread –o filename filename.cc ». Si vous ne déployez pas le '-pthread' dans la commande, il est possible qu'une exception soit levée par le compilateur. En conséquence, nous avons effectivement créé une fonction d'attente conditionnelle qui attend que l'objet volatil soit modifié par une force extérieure. Il est important de garder à l'esprit que le bloc de code de mise à jour peut provenir d'une section de traduction différente ou d'une action de signal externe, même si ce code fonctionnera toujours de la même manière si le qualificateur volatil est supprimé et qu'une variable globale conventionnelle est utilisée.

Conclusion

Ici, nous passons en revue un aperçu de Volatile en C++ ainsi que la syntaxe, l'utilisation et les exemples appropriés pour une meilleure compréhension. Puisque le compilateur ne peut pas prédire la valeur, volatile est crucial dans la programmation C. Le principal avantage de l'utilisation de la volatilité est que sa valeur peut varier chaque fois qu'un utilisateur demande sa modification ou lorsqu'un autre fil utilisant la même variable est actif.