[C++] A quoi sert le mot clef volatile ?

A quoi sert le mot clef volatile ? [C++] - Programmation

Marsh Posté le 06-07-2001 à 11:11:45    

J'aimerais savoir à quoi sert le mot clef volatile. La doc donne plusieurs définitions différentes.

Reply

Marsh Posté le 06-07-2001 à 11:11:45   

Reply

Marsh Posté le 06-07-2001 à 11:13:00    

c pas un truc du genre que la var peut etre modifie par une autre thread ?

Reply

Marsh Posté le 06-07-2001 à 12:19:28    

volatile, c'est pour qu'une variable puisse être modifiée par autre chose que le process qui l'a créé.
On utilise souvent ca quand on programme du hardware.

Reply

Marsh Posté le 06-07-2001 à 12:36:35    

process ou thread ca ce rejoint en qq sorte.
donc moi raison :)

Reply

Marsh Posté le 06-07-2001 à 12:52:02    

volatile est traduit par le copilateur par : ne mets jamais cette variable en registre.
 
En effet, le processeur charge des variables dans ses registres pour un traîtement plus rapide, mais quand il y a un changement de thread, ces registes sont sauvegardés (pour être restaurés quand le thread est réactivé) sans checher à remettre les variables dans leurs emplacements mémoire qui leur appartiennent.
 
Il se peut donc que la version la plus à jour d'une variable soit dans un registre, et que je changement de tâche active un autre thread qui veut toucher à la variable. Celui-ci voit donc une variable non à jour, et de toute manière, qd le premier thread sera activé, celui là risque bien d'écraser la varible en mémoire par la valeur qu'il avait en registre.
 
Pour palier à ceci, un volatile évitera le passage en registre.  
 
Mais il faut savoir que le volatile empêche l'optimisation de la variable, aussi ce n'est pas sérieux de mettre un compteur de boucle interne en volatile (ou autres conneries de ce genre).
 
Enfin, quand on a un prog qui ne bugge pas en debug, mais qui plante en version optimisée ou release, l'absence de volatile est une cause possible de plantage. C'est chiant car c'est un problème que l'on ne peut pas voir avec le débuggueur.


---------------
-----------------------
Reply

Marsh Posté le 06-07-2001 à 16:35:53    

Le cas classique en multi-Thread c'est :
 
 
Mutex.Lock();
while( !continue)
{
   Mutex.UnLock();
   faire qq chose en attendant mais sans modifier continue
   Mutex.Lock()
}
Mutex.Unlock();
 
While (!continue) a de fortes chance d'etre optimise en while(true) alors que cette boucle est typiquement en attente de liberation d'un autre thread...

Reply

Marsh Posté le 06-07-2001 à 17:30:03    

merci à tous

Reply

Marsh Posté le 03-06-2009 à 22:37:11    

BENB a écrit :

Le cas classique en multi-Thread c'est :
 
 
Mutex.Lock();
while( !continue)
{
   Mutex.UnLock();
   faire qq chose en attendant mais sans modifier continue
   Mutex.Lock()
}
Mutex.Unlock();
 
While (!continue) a de fortes chance d'etre optimise en while(true) alors que cette boucle est typiquement en attente de liberation d'un autre thread...


 
Puisque ce thread est là depuis si longtemps sans réponse, je voulais simplement prévenir le lecteur éventuel que c'est exactement ce qu'il ne faut PAS faire avec le mot clé volatile.
 
Volatile n'a rien à voir avec le multi-threading. Ce mot est généralement utilisé lorsque le contenu de la mémoire peu changer sans raison logicielle. Par exemple, du matériel (hardware) comme une sonde de température mappée sur une adresse mémoire. Google un peu pour voir et comprendre.

Reply

Marsh Posté le 04-06-2009 à 09:04:27    

janoscoder a écrit :

volatile est traduit par le copilateur par : ne mets jamais cette variable en registre.


Nan hein. Ca lui dit qu'il doit relire la variable systématiquement. Seulement faire de la synchro avec, c'est complètement bidon.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed