Encontré un artículo de 2001 sobre el Dr. Dobbs: volatile - Multithreaded Programmer's Best Friend. Siempre he considerado que "volátil" es algo inútil, al menos como un calificador de variables, ya que el acceso a las variables compartidas entre hilos siempre pasa por algún tipo de capa de biblioteca.Consecuencia de rendimiento de las funciones de miembros volátiles
No obstante, marcar instancias de clase y métodos, como 'volátil' para indicar su grado de seguridad de subprocesos como se presenta en el artículo parece muy convincente.
Para resumir el artículo rápidamente, la idea central es podría declarar una clase como esta:
struct SomeObject {
void SingleThreadedMethod();
void Method();
void Method() volatile;
};
Y luego, las instancias de la clase, así:
// An object that will only be accessed from a single thread.
SomeObject singleThreaded;
// An objecect that will be accessed from multiple threads.
volatile SomeObject sharedObject;
sharedObject.SingleThreadedMethod(); //this will be an compile error
sharedObject.Method(); // will call the volatile overload of Method
singleThreaded.Method(); // would call the non volatile overload of Method.
La idea es que métodos como "Método() volátil" se implementarían:
void SomeObject::Method() volatile {
enter_critical_section();
const_cast<Method*>(this)->Method();
leave_critical_Section();
}
Obviamente punteros inteligentes puede automatizar el proceso atomic-lock-and-cast-to-non-volátil - el punto es que el calificador volátil se puede usar, en su uso previsto, para marcar a los miembros de la clase y las instancias para indicar cómo se van a usar desde varios hilos y, por lo tanto, hacer que el compilador le informe al desarrollador cuándo se están llamando a los métodos de un único subproceso (no volátil) en un objeto volátil, o incluso para elegir la versión de subprocesos automáticamente.
Mi pregunta sobre este enfoque es: ¿Cuáles son las implicaciones de rendimiento de los métodos calificados 'volátiles'? ¿Se obliga al compilador a asumir que todas las variables a las que se accede en una función volátil deben tratarse como volátiles y, por lo tanto, deben excluirse de las oportunidades de optimización? ¿Se excluirán las variables locales de la optimización? Eso podría ser un gran lastre para el rendimiento en cualquier función volátil de miembro calificado si es así.
"es el compilador obligado a asumir que todas las variables accedidas en una función volátil necesitan ser tratados tan volátil y por lo tanto excluidos de las oportunidades de optimización" Yo piense así: se requiere que el compilador cargue desde la memoria el puntero 'this' cada vez que se toca el objeto. Sin embargo, las variables locales no deberían verse afectadas. –
Algunas publicaciones relacionadas: http://stackoverflow.com/questions/2491495, http://stackoverflow.com/questions/2479067 – ronag
No hago "muchas preguntas" favoritas, pero preferí esta. Excelente pregunta –