x = y = true; // are two bools assigned together atomically?
Cette ligne est évidemment pas une opération atomique x et y sont dans deux endroits différents dans la mémoire: il est impossible de définir deux endroits qui ne sont pas continuous³ un l'autre en même temps.
Le mot atomique implique que lecture ou d'écriture se fait dans un cycle¹ cpu, donc une variable est sûre, mais x et y sont deuxdifférentes variables atomiques.
Si vous avez des doutes sur ne pas hésiter à regarder le code binaire produit, grâce à l'utilisation d'un désassembleur.
if(!x && !y) ...
La même: la CPU doivent accéder à la valeur des deuxdifférentes des variables en copiant les valeurs dans son propre registre, faire une évaluation booléenne, nier, et effectuer une evaluation² ; opérations clairement non atomiques.
¹ il est pas si simple, mais d'un vous devez penser que
² encore, il est pas si simple, langue plus point de developpeur de vue, comme le compilateur peut sûrement faire des optimisations, et l'unité centrale de traitement peut faire certaines choses par elles-mêmes
³ même avec des emplacements continus, la taille totale doit être lisible/inscriptible en une seule boucle: 1Mo de données ne sont clairement pas lisibles dans une boucle par le CPU, même si toutes les données sont continuellement côte à côte.
question différente, mais un peu liée: https://stackoverflow.com/questions/8858387/stdatomic-treat-a-pair-of-atomic-int32-as-one-atomic-int64 – user463035818
@RickAstley Je ne sais pas voyez comme cela suit. 'x.store' promet que l'action d'assigner' x' est atomique; il ne dit pas si l'évaluation de son argument est atomique avec cela. Cela n'a tout simplement aucun sens. Par votre raisonnement, vous pouvez stocker le résultat d'une fonction énorme et rendre toute la fonction atomique. Maintenant, votre variable atomique (qui pourrait être un simple booléen) agit comme un mutex. –