Non, il n'y a aucune garantie.
Bien que je doive vraiment m'arrêter là parce que c'est une réponse complète, si vous pensez "comment cela pourrait-il mal se passer", considérez une implémentation où une écriture dans une variable non atomique n'est pas atomique. Donc si vous avez 0x2F
écrites et ensuite écrites 0x30
il est possible qu'un autre thread lise le premier nibble avant l'écriture et le second nibble après et obtienne 0x20
.
Supposons également qu'une variable non atomique ait la valeur zéro et que ce code s'exécute :
#define LAUNCH 1
#define DO_NOT_LAUNCH 0
if (war_has_been_declared)
non_atomic_variable = LAUNCH;
else
non_atomic_variable = DO_NOT_LAUNCH;
Aucune règle n'interdit à l'implémentation d'optimiser le code en ce sens :
non_atomic_variable = LAUNCH;
if (! war_has_been_declared)
non_atomic_variable = DO_NOT_LAUNCH;
Cela signifie qu'une autre discussion peut recevoir un ordre de LANCEMENT même si la guerre n'a pas été déclarée !
Mais il est important de se rappeler qu'il n'y a tout simplement aucune garantie. Peu importe que vous puissiez penser à une façon plausible dont les choses pourraient mal tourner.