podemos cambiar en cualquier momento, ya que no es constante?
Sí, puede cambiarlo, pero C++ no dice lo que debe suceder a continuación. Eso depende de la máquina abstracta (es decir, la plataforma en la que está trabajando).
Si la variable volátil no se asigna a un registro de un dispositivo de HW, a continuación, la variable volátil se comportará casi como una variable normal. He dicho casi, porque no va a ser capaz de pasar a métodos y funciones que esperan int no volátil, como éste:
void foo(int & p);
Si los mapas de variables a un registro de un dispositivo de HW, a continuación, tratando de escribir a un registro de solo lectura depende del dispositivo. Simplemente puede ignorar las escrituras, pero también puede indicar un error, C++ no dice nada.
volatile
es un cv-calificador, utilizado para acceder a los registros de hardware, o parte de la memoria que puede ser modificado externamente (por ejemplo, por un controlador).
El estándar de C++ en [dcl.type.cv]/7 dice:
[Nota: volátil es un indicio a la aplicación para evitar agresiva optimización que implica el objeto debido a que el valor del objeto podría ser cambiado por medios indetectables por una implementación. Ver 1.9 para una semántica detallada. En general, la semántica de volátiles son pretenden ser el mismo en C++ como lo son en C. - nota final]
El artículo Stay away from Volatile in threaded code? dice lo que el volátil es bueno para:
La palabra clave volátil no es una primitiva de subprocesamiento o sincronización en C o C++ portátil. Se destina principalmente a
1) Permitir el acceso a dispositivos de red mapeadas de memoria (punteros es decir, a la estructura de datos en la memoria coherente que se pueden modificar por los dispositivos de E/S.)
2) Las variables en los manejadores de señales y entre setjmp y longjmp (ref: volátiles en Wikipedia)
otro artículo Volatile: Almost Useless for Multi-Threaded Programming dice:
Hans Boehm señala que sólo hay tres usos portátiles para volátil. Los resumiré aquí:
* marcando una variable local en el ámbito de un setjmp para que la variable no retroceda después de un longjmp.
* de memoria que es modificado por un agente externo o parece ser debido a una asignación de memoria chiflado
* manejador de señales mal
y
Si está multi-threading en aras de la velocidad, la ralentización del código definitivamente no es lo que quieres. Para la programación de subprocesos múltiples, existen dos problemas clave que a menudo se piensa que son volátiles:
* atomicity
* consistencia de la memoria, es decir, el orden de las operaciones de un subproceso visto por otro subproceso.
Lo que es importante es que volátil no deben utilizarse en el entorno multihilo como mecanismo de sincronización, o como para proporcionar acceso atómica, ya que puede funcionar en algunos compiladores, y no en otra. Para eso hay otras herramientas para sincronización (por ejemplo semáforos, o mutex con variable condicional) y acceso atómico (atomic library.
otra respuesta incorrecta. volátil no tiene nada que ver con el enhebrado e interrumpe –
De hecho, una muy buena respuesta teniendo en cuenta la suya esencialmente dice lo mismo, además de mencionar cosas que el OP no solicita. –
@AlexanderGessler "A menos que esté utilizando interrupciones de bajo nivel o algunos usos de subprocesamiento, entonces no necesita usarlo". –