Modèle de mémoire en C ++: cohérence séquentielle et atomicité

J’ai quelques questions liées au modèle de mémoire en C ++ 11.

Sur https://www.think-cell.com/fr/career/talks/pdf/think-cell_talk_memorymodel.pdf sur la 29. la diapositive est écrite

Le modèle de mémoire C ++ garantit la cohérence séquentielle

Mais, dans mes précédents articles, j’avais appris que la mémoire C ++ avait un modèle de mémoire faible – le compilateur peut réorganiser à sa guise – il doit satisfaire comme si c’était la règle.

Je pense avoir compris de quoi la diapositive parle, en lisant les diapositives précédentes:

diapositive 12: cohérence séquentielle [Leslie Lamport, 1979]
le résultat de toute exécution est le même que si

  1. les opérations de tous les threads sont exécutées dans un ordre séquentiel
  2. les opérations de chaque thread apparaissent dans cette séquence dans l’ordre spécifié par leur programme

slide14: cohérence séquentielle pour les programmes sans course de données
SC-DRF:

  • Nous veillons à ce que notre programme ne contienne pas de courses de données
  • Le système garantit une exécution cohérente de manière séquentielle

Ainsi, sur la diapositive 29, les auteurs disent qu’une fois que vous évitez d’utiliser Data-Race UB avec std::atomic , le programme s’exécute comme si tout s’était passé dans l’ordre.

C’est un moyen intéressant d’examiner le modèle de mémoire faible de C ++. Cela ressemble à un bon ensemble de diapositives.


Deuxième partie

S’il vous plaît ne prenez pas l’habitude de poser deux questions très différentes à la fois.

Ce “comment le CPU le fait-il?” question serait un meilleur ajustement dans le cadre de votre dernière question: Atomicity sur x86

J’ai la plupart du temps une réponse à cela déjà écrite, que je vais mettre là à la place.

Le modèle de mémoire C ++ garantit la cohérence séquentielle si vous utilisez des opérations atomiques avec les ordres de mémoire appropriés pour garantir la cohérence séquentielle . Si vous utilisez uniquement des opérations non atomiques simples, ou des atomes atomiques assouplis, sans mutex, la cohérence séquentielle n’est pas garantie.

Les compilateurs sont libres de réorganiser les opérations si la différence de comportement ne peut pas être observée, c’est la règle as-if. Ainsi, par exemple, si le fait de réordonner des variables atomiques cohérentes séquentielles produirait un résultat observable différent, il ne respecte pas la règle as-if. Si cela ne donne pas un résultat observable différent, la réorganisation est autorisée.