2 votes

Sécurité des fils C++ : Si un seul thread peut écrire dans une variable non atomique mais que plusieurs threads la lisent, des problèmes peuvent-ils survenir ?

Si un thread lit une variable primitive non atomique sur laquelle un autre thread écrit, est-il assuré de lire la valeur avant ou après l'écriture ou peut-il lire une version corrompue pendant l'écriture ?

Je sais que les collections telles que les listes chaînées sont une autre histoire.

8voto

David Schwartz Points 70129

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X