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


Por lo que he leído de Herb Sutter y otros se podría pensar que volatile y la programación concurrente eran conceptos completamente ortogonales, al menos en lo que respecta 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 Anthony Williams de std::atomic.

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

Author: Ville-Valtteri, 2010-03-19

3 answers

¿Por qué se utiliza el calificador volatile a lo largo de std::atomic?

Para que los objetos volátiles también puedan ser atómicos. Ver aquí:

La cita relevante es

Las funciones y operaciones se definen 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.

 56
Author: stephan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-09 07:46:46

Para resumir lo que otros han escrito correctamente:

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

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

Por supuesto, como mi artículo señaló, 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<>).

 77
Author: Herb Sutter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-05 13:15:37

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

No estoy teniendo un buen día... tan 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;
};
 15
Author: David Rodríguez - dribeas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-19 17:25:36