Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4519 connectés 

 


Dernière réponse
Sujet : [C++] A quoi sert le mot clef volatile ?
Taz

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.


Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
Taz

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.

cque

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.

chadenat merci à tous
BENB 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...
janoscoder 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.
TheJackal process ou thread ca ce rejoint en qq sorte.
donc moi raison :)
SoWhatIn22 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.
TheJackal c pas un truc du genre que la var peut etre modifie par une autre thread ?
chadenat J'aimerais savoir à quoi sert le mot clef volatile. La doc donne plusieurs définitions différentes.

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)