Modelo de memoria en C ++: consistencia secuencial y atomicidad

Tengo algunas preguntas relacionadas con el modelo de memoria en C ++ 11.

En https://www.think-cell.com/en/career/talks/pdf/think-cell_talk_memorymodel.pdf en la diapositiva 29. está escrito

El modelo de memoria C ++ garantiza consistencia secuencial.

Pero, en mis publicaciones anteriores, aprendí que la memoria de C ++ tiene un modelo de memoria débil (el comstackdor puede hacer el pedido como quiera), tiene que satisfacer como regla.

Creo que me di cuenta de qué habla esa diapositiva, leyendo las diapositivas anteriores:

diapositiva 12: consistencia secuencial [Leslie Lamport, 1979]
El resultado de cualquier ejecución es el mismo que si.

  1. Las operaciones de todos los hilos se ejecutan en algún orden secuencial.
  2. Las operaciones de cada hilo aparecen en esta secuencia en el orden especificado por su progtwig.

diapositiva 14: consistencia secuencial para progtwigs sin datos de carrera
SC-DRF:

  • Cuidamos que nuestro progtwig no contenga carreras de datos.
  • El sistema garantiza una ejecución secuencialmente consistente.

Entonces, en la diapositiva 29, los autores dicen que una vez que evites la carrera de datos UB usando std::atomic , el progtwig se ejecuta como si todo sucediera en el orden del progtwig.

Esta es una forma interesante de ver el modelo de memoria débil de C ++. Esto parece un buen conjunto de diapositivas.


La segunda parte

Por favor, no hagas el hábito de hacer dos preguntas muy diferentes a la vez.

Este “¿cómo lo hace la CPU?” La pregunta sería un mejor ajuste como parte de su pregunta posterior: Atomicidad en x86

Ya tengo la mayoría de las respuestas escritas, que colocaré allí.

El modelo de memoria C ++ garantiza la coherencia secuencial si utiliza operaciones atómicas con los ordenamientos de memoria adecuados para garantizar la coherencia secuencial . Si solo utiliza operaciones simples no atómicas, o atómicas relajadas, y sin exclusión mutua, no se garantiza la consistencia secuencial.

Los comstackdores tienen la libertad de reordenar las operaciones si no se puede observar la diferencia en el comportamiento, esa es la regla de “como si”. Entonces, por ejemplo, si reordenar atómicas secuencialmente consistentes produciría un resultado observable diferente, entonces no cumple con la regla de “como si”. Si no produce un resultado observable diferente, entonces se permite la reordenación.