Variables volátiles en C 11
La introducción de un modelo de máquina multiproceso en el estándar C 11 plantea dudas sobre el comportamiento de las variables volátiles variables, que tradicionalmente se han utilizado para evitar la optimización que podría dar lugar a un comportamiento indefinido en entornos concurrentes.
En C 98/03, la falta de reconocimiento de subprocesos múltiples en el modelo de memoria significó que el compilador podía optimizar la lectura de una variable volátil, lo que lleva al infame ejemplo de un bucle while interminable esperando que una variable cambie su valor.
Sin embargo, el modelo de memoria C 11 reconoce la posibilidad de acceso simultáneo a variables. ¿Significa esto que volátil ahora está en desuso?
Optimizaciones del compilador y comportamiento indefinido
La respuesta radica en la naturaleza matizada del modelo de memoria C 11. Si bien reconoce subprocesos múltiples, no elimina la posibilidad de un comportamiento indefinido al acceder a variables sin una sincronización adecuada. Incluso en un entorno de subprocesos múltiples, el acceso no atómico a las variables compartidas permanece indefinido.
volatile int x;
void func() {
x = 0;
while (x = = 0) {}
}
Por lo tanto, en nuestro código de ejemplo, el compilador aún es libre de optimizar la lectura de x en el bucle while, lo que resulta en un comportamiento indefinido. Volátil solo afecta los accesos a la memoria, no el comportamiento de los subprocesos.
Barreras de memoria e integridad de los subprocesos
La integridad de los subprocesos requiere mecanismos de sincronización adecuados para garantizar la visibilidad de las escrituras de un subproceso a otro . El modelo de memoria C 11 define específicamente cuándo y cómo las escrituras se vuelven visibles para otros subprocesos. volátil no aborda este requisito.
volatile garantiza que el compilador no puede optimizar las lecturas de memoria de una variable, pero no proporciona ninguna garantía sobre la visibilidad del subproceso. Las barreras de memoria, emitidas por construcciones de sincronización como bloqueos u operaciones atómicas, son necesarias para garantizar que las escrituras estén sincronizadas entre los núcleos.
Conclusiones
En C 11, lo volátil sigue siendo relevante para evitar optimizaciones que podrían conducir a accesos incorrectos a la memoria. Sin embargo, no es suficiente para la programación multiproceso. Aún se requieren mecanismos de sincronización adecuados para garantizar la integridad de los subprocesos y el comportamiento definido en entornos concurrentes.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3