¿Por qué se usa el calificador volátil a través de std :: atomic?

Por lo que he leído de Herb Sutter y otros , pensarías que la progtwigción volatile y concurrente eran conceptos completamente ortogonales, al menos en lo que se refiere a C / C ++.

Sin embargo, en la implementación de GCC todas las funciones miembro de std::atomic tienen el calificador volatile . Lo mismo es cierto en la implementación de std::atomic Anthony Williams.

Entonces, ¿cuál es el problema, mis variables atomic necesitan ser volatile o no?

¿Por qué se usa el calificador volatile en std::atomic ?

De modo que los objetos volátiles también pueden ser atómicos. Ver aquí :

La cita relevante es

Las funciones y operaciones están definidas para trabajar con objetos volátiles, de modo que las variables que deberían ser volátiles también pueden ser atómicas. El calificador volátil, sin embargo, no es necesario para la atomicidad.

¿Mis variables atomic<> deben ser volatile o no?

No, los objetos atómicos no tienen que ser volátiles.

Para resumir lo que otros han escrito correctamente:

C / C ++ volatile es para acceso de hardware e interrupciones. C ++ 11 atomic<> es para comunicación entre hilos (por ejemplo, en código sin locking). Esos dos conceptos / usos son ortogonales, pero tienen requisitos superpuestos y es por eso que las personas a menudo los han confundido.

La razón por la cual atomic<> tiene funciones volátiles es la misma razón por la que tiene funciones const, porque es posible, en principio, que un objeto sea atomic<> y también const y / o volatile .

Por supuesto, como señaló mi artículo, otra fuente de confusión es que C / C ++ volatile no es lo mismo que C # / Java volatile (este último es básicamente equivalente a C ++ 11 atomic<> ).

Como const, volátil es transitivo. Si declara que un método es volatile , no puede llamar a ningún método no volátil ni a ninguno de sus atributos de miembro. Al tener std::atomic métodos std::atomic volatile , permite llamadas desde métodos de miembros volatile en clases que contienen las variables std::atomic .

No estoy teniendo un buen día … muy confuso … tal vez un pequeño ejemplo ayude:

 struct element { void op1() volatile; void op2(); }; struct container { void foo() volatile { e.op1(); // correct //e.op2(); // compile time error } element e; };