[3DArchi] Fork de cette discussion [/3DArchi]
Bonjour,
Excusez moi ce n'est pas vraimment en reponse au sujet du thread mais je me demandais quel est l'effet du mot cles volatile sur une fonction?
merci.
[3DArchi] Fork de cette discussion [/3DArchi]
Bonjour,
Excusez moi ce n'est pas vraimment en reponse au sujet du thread mais je me demandais quel est l'effet du mot cles volatile sur une fonction?
merci.
Tout comme const, si tu déclares un objet volatile tu ne peux que appeler des fonctions membres volatiles de cet objet.
Salut,
Le mot clé volatile indique au compilateur que la valeur de (la variable /le membre) est susceptible d'être modifiée entre deux évaluation de celle-ci.
Cela aura essentiellement comme résultat d'empêcher le compilateur d'effectuer certaines optimisations (comme le fait de placer la variable dans un registre), et donc de forcer le fait de récupérer à chaque fois la valeur ad-hoc en mémoire.
Les modifications peuvent survenir:
- suite à une modification apportée par le système d'exploitation
- suite à une modification apportée par un thread concurrent
- ...
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Salut,
volatile pour une variable signifie qu'y accéder est un effet de bord. Cela veut dire que même une lecture peut changer son état ou l'état d'une autre partie du programme. Ou dit autrement encore, une variable volatile peut changer de valeur ou provoquer le changement de valeur d'autres variables par des moyens inconnus par le compilateur. Cela permet d'éviter certaines optimisations du compilateur.
Une fonction volatile indique que this et par conséquence les membres de la classe doivent être considérés comme volatile.
A quoi ça sert ? En bas niveau, c'est utilisé lorsqu'on accède à des variables (zones mémoires) gérées par le hard.
Exemple tiré d'un dev.
La datasheet de la flash me dit que je dois faire 2 lectures consécutives à un endroit bien précis. Si j'ai la même valeur, alors la flash est disponible pour une opération d'écriture, de lecture ou d'effacement. Si non, cela signifie que la flash est occupée et je ne peux y accéder ni en lecture ni en écriture.
Si le code est écrit comme ça :
Le compilateur est légitime à déduire que status1 et status2 ont la même valeur, donc status1^status2 vaut 0, donc toggle vaut 0 donc je passe toujours par le else. Et par là, supprimer tout le code qu'il juge inutile et transformer la fonction en :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 const int flash_status; bool is_flash_ready() { int const status1 = flash_status; int const status2 = flash_status; int const toggle = status1^status2; if(toggle) {//flash busy return false; } else {//flash ready return true; } }A contrario, si j'écris :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 bool is_flash_ready() { return true; }
On indique au compilateur que la valeur de flash_status entre (1) et (2) peut changer sans qu'il le sache. Et donc de ne rien déduire ni optimiser là dessus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 const volatile int flash_status; bool is_flash_ready() { int const status1 = flash_status; // (1) int const status2 = flash_status; // (2) int const toggle = status1^status2; if(toggle) {//flash busy return false; } else {//flash ready return true; } }
Tu remarques que la variable est volatile et const. Serait-ce contradictoireEn fait non. volatile dit que la variable peut changer par des mécanismes inconnus du compilateur. const dit que le programme ne peut pas changer la variable et donc le compilateur doit le vérifier. Seule la lecture est autorisée. L'écriture est interdite. Les deux qualificatifs ont bien un sens différent l'un de l'autre.
C'est aussi un bug récurrent en embarqué lorsqu'on oublie le qualificatif volatile et que l'on accède à une variable dans une boucle. Le compilateur sort l'évaluation de la variable à l'extérieur de la boucle à des fins d'optimisations ... mais ça change tout par rapport à ce que voulait faire le développeurs.
Voilà pour l'utilité de volatile.
Un dernier point, volatile n'a rien à voir avec la programmation multithread. La volatilité de la variable est du à des éléments externes au programme.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Bonjour,
Je vous remerci pour vos reponses clairs et precises.
J'ai compris l'utilites de ce mot cles.
Merci encore pour votre temps et bonne journee!
Partager