2010-03-19 15 views
69

Por lo que he leído de Herb Sutter y others, pensaría que volatile y la programación concurrente eran conceptos completamente ortogonales, al menos en lo que respecta a C/C++. Sin embargo, en GCC implementation todas las funciones miembro de std::atomic tienen el calificador volatile. Lo mismo es cierto en Anthony Williams's implementation de std::atomic.¿Por qué el calificador volátil se usa a través de std :: atomic?

¿De qué se trata, mis variables atomic<> necesitan ser volatile o no?

+0

+1 Sr.Williams está aquí en SO, tal vez él puede aparecer y dar una respuesta :) – AraK

+1

He visto una pregunta en comp.std.C++ sobre eso. Recuerde que las garantías 'volátiles' que lee y escribe en un solo hilo se hacen en orden y que un objeto volátil no puede tener funciones miembro no volátiles que se invoquen sobre él (como const). Pero más allá de eso, no tengo ni idea acerca de los hilos en C++. Cada vez que trato de leer sobre esto en el Estándar, estoy empezando a darme por vencida, no siendo capaz de captar la cantidad de indirecciones y lógicas en el texto xD –

Respuesta

55

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

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

La cita relevante es

Las funciones y las operaciones se definen para trabajar con objetos volátiles, por lo que las variables que deben ser volátiles también pueden ser atómicas. El calificador volátil, sin embargo, no es necesario para la atomicidad.

hacer mi atomic<> las variables tienen que ser volatile o no?

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

+0

Nota: Esto es técnicamente lo mismo que el http: // stackoverflow específico de la plataforma .com/questions/3708160/what-is-the-effect-of-interlockedincrement-argument-declared-as-volátil – Suma

+0

El calificador volátil se utiliza para evitar el reordenamiento. Eso es lo que hace. –

15

Como const, volátil es transitivo. Si declara un método como 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 volatile, permite llamar a los métodos miembros volatile en las clases que contienen las variables std::atomic.

No estoy teniendo un buen día ... tan confuso ... tal vez un poco de ayuda ejemplo:

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

Para resumir lo que otros han escrito correctamente:

C/C++ es para volatile acceso a hardware e interrupciones. C++ 11 atomic<> es para comunicación entre hilos (por ejemplo, en código sin bloqueo). 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 de que atomic<> tiene funciones volátiles calificados es la misma razón por la que tiene funciones const cualificado, ya que es posible, en principio, para un objeto sea tanto atomic<> y también 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<>).

+2

Voy a abusar del hecho de que usted está aquí para preguntar su opinión sobre un artículo de Alexandrescu sobre el uso de la bandera 'volátil' para producir errores en tiempo de compilación en código inseguro (usando instancias' volátiles' para bloquear el uso de la interfaz y 'const_cast' para eliminar el volátil cuando se adquiere un mutex). ¿Podría tener sentido agregar un calificador de tipo 'threadsafe' o similar para este propósito en el idioma (estoy pensando en voz alta) El artículo está aquí: http://www.drdobbs.com/cpp/184403766;jsessionid=OEWBPI10M2IQLQE1GHPCKHWATMY32JVN –

+0

Lo he agregado como una pregunta aquí: http://stackoverflow.com/questions/2491495 –

+10

En algunos de los artículos de Andrei, lo que realmente estaba haciendo era para secuestrar (es decir, "reutilizar") la palabra clave volátil como una práctica etiqueta en su mayoría no utilizada en el sistema de tipo que podría utilizar como un gancho a la sobrecarga y obtener otros efectos, que era un poco confuso porque no se indicó de esa manera. –

Cuestiones relacionadas