Supongo que el "Modelo de falta de memoria" en estos casos solo significa que los optimizadores se escribieron antes de que se publicara el modelo de memoria C++ 11, y podrían realizar ahora optimizaciones no válidas. Es muy difícil y lleva mucho tiempo validar las optimizaciones en comparación con el modelo de memoria, por lo que no es una gran sorpresa que los equipos clang/gcc aún no hayan terminado.
¿La falta de compatibilidad con el modelo de memoria significa que los programas legales de C++ 11 que usan std :: atomic arent seq son consistentes?
Sí, es una posibilidad. Es incluso peor: el compilador podría introducir carreras de datos en (de acuerdo con el estándar C++ 11) los programas libres de raza, p. introduciendo escrituras especulativas.
Por ejemplo, varios compiladores de C++ que se utilizan para realizar esta optimización:
for (p = q; p = p -> next; ++p) {
if (p -> data > 0) ++count;
}
se pudo obtener optimizado en:
register int r1 = count;
for (p = q; p = p -> next; ++p) {
if (p -> data > 0) ++r1;
}
count = r1;
Si todo p->data
no son negativos, el código fuente original no escribieron a count
, pero el código optimizado sí lo hace. Esto puede introducir una carrera de datos en un programa sin carreras, por lo que la especificación C++ 11 no permite dichas optimizaciones. Los compiladores existentes ahora deben verificar (y ajustar si es necesario) todas las optimizaciones.
Ver Concurrency memory model compiler consequences para más detalles.
La atomicidad es una de las (tres?) Propiedades del modelo de memoria, junto con la visibilidad de la memoria y el orden de la memoria. La atomicidad no es un "sinónimo" de modelo de memoria. – mloskot