De courte et de réponse rapide: volatile
est (presque) inutile pour la plate-forme agnostique, multithread de programmation d'application. Il ne fournit pas de synchronisation, il ne crée pas de la mémoire des clôtures, ni n'assure la commande de l'exécution des opérations. Il n'a pas à effectuer des opérations atomiques. Il n'est pas de rendre votre code comme par magie thread-safe. volatile
peut-être le plus mal compris de la facilité dans l'ensemble de C++. Voir cela, cela et cela pour plus d'informations sur l' volatile
D'autre part, volatile
n'ont une utilisation qui pourrait ne pas être si évident. Il peut être utilisé de la même façon, on peut utiliser const
pour aider le compilateur vous montrer où vous pouvez faire une erreur dans l'accès à certaines ressources partagées dans un non-protégés. Cette utilisation est discutée par Alexandrescu dans cet article. Toutefois, c'est essentiellement l'aide de C++ type de système d'une manière qui est souvent considéré comme une machination et peut évoquer un Comportement Indéfini.
volatile
a été spécifiquement conçu pour être utilisé lors de l'interfaçage avec le matériel mappé en mémoire, les gestionnaires de signaux et le setjmp code machine instruction. Cela rend volatile
sont directement applicables au niveau des systèmes de programmation, plutôt que la normale applications au niveau de la programmation.
L'2003 C++ Standard ne veut pas dire qu' volatile
s'applique à tout type d'Acquérir ou de Libération de la sémantique sur les variables. En fait, la Norme est complètement silencieux sur toutes les questions de multithreading. Toutefois, les plates-formes spécifiques ne s'appliquent Acquérir et la Libération de la sémantique sur volatile
variables.
[Mise à jour pour le C++11]
Le C++11 Est la Norme maintenant, ne reconnaissez multithreading directement dans le modèle de mémoire et de la lanuage, et il offre des installations de bibliothèque de traiter avec elle en une plate-forme indépendante. Cependant, la sémantique de l' volatile
n'ont toujours pas changé. volatile
n'est pas encore un mécanisme de synchronisation. Bjarne Stroustrup dit dans TCPPPL4E:
Ne pas utiliser volatile
, sauf dans les bas-niveau du code qui traite directement
avec le matériel.
Ne pas assumer volatile
a une signification spéciale dans le modèle de mémoire. Il
ne fait pas. Il n'est pas, comme dans certains, plus tard pour les langues-un
mécanisme de synchronisation. Sto obtenir la synchronisation, utilisez atomic
, un
mutex
, ou un condition_variable
.
[/Fin de mise à jour]
Ci-dessus s'applique le C++ le langage lui-même, tel que défini par le Standard 2003 (et maintenant le 2011 Standard). Certains des plates-formes spécifiques, toutefois, ne l'ajout de fonctionnalités supplémentaires ou des restrictions à ce qu' volatile
. Par exemple, dans Windows 2010 (au moins) d'Acquérir et de Libération de la sémantique ne s'appliquent à certaines opérations sur volatile
variables. À partir de la MSDN:
Lors de l'optimisation, le compilateur doit maintenir la commande parmi les références
la volatilité des objets ainsi que des références à d'autres objets globaux. Dans
en particulier,
Une écriture à un objet volatile (écriture volatile) a Communiqué sémantique; une
référence à un mondial ou un objet statique qui se produit avant l'écriture d'un
volatile objet dans la séquence d'instruction va se produire avant que
écriture volatile dans le binaire compilé.
Une lecture d'un volatile objet volatils (lire) a Acquérir sémantique; une
référence à un mondial ou un objet statique qui se produit après une lecture de
la mémoire volatile dans la séquence d'instruction se fera après que
lecture volatile dans le binaire compilé.