3 votes

Interactions entre les modes de libération et d'acquisition du modèle de mémoire et les opérations atomiques relaxées.

Le GCC Wiki dit ceci à propos du mode de synchronisation du modèle de mémoire Acquérir/Libérer :

Pour rendre les choses un peu plus complexes, les interactions des variables non atomiques sont toujours les mêmes. Tout stockage avant une opération atomique doit être vu dans les autres threads qui se synchronisent. Par exemple :

 -Thread 1-
 y = 20;
 x.store (10, memory\_order\_release);

 -Thread 2-
 if (x.load(memory\_order\_acquire) == 10)
    assert (y == 20);Comme 'y' n'est pas une variable atomique, le stockage dans 'y' _se passe avant_ le magasin à 'x', donc l'assert ne peut pas échouer dans ce cas. Les optimiseurs doivent encore limiter les opérations effectuées sur les variables de mémoire partagée autour d'opérations atomiques.

Maintenant, que se passe-t-il si je fais de 'y' une variable atomique (sans imposer se passe avant restrictions) ?

 -Thread 1-
 y.store (20, memory_order_relaxed);
 x.store (10, memory_order_release);

 -Thread 2-
 if (x.load(memory_order_acquire) == 10)
    assert (y.load (memory_order_relaxed) == 20);

L'affirmation peut-elle échouer ? Y a-t-il moins d'exigences pour les variables atomiques que pour les variables non-atomiques ? Ou est-ce que la restriction du Wiki aux variables non-atomiques est gratuite et trompeuse ici ?

4voto

LWimsey Points 2916

Comme 'y' n'est pas une variable atomique, le stockage dans 'y' se fait avant le stockage dans 'x'.

La déclaration "depuis y n'est pas une opération atomique" est incorrect . Les mêmes règles d'ordonnancement s'appliquent aux opérations atomiques et non atomiques.

Les barrières d'acquisition/libération garantissent que l'opération de mémoire A (le stockage à y ) séquencés avant le stockage/relâchement se passe avant l'opération de mémoire B (le assert ) séquencée après le chargement/acquisition qui voit la valeur stockée. Que les opérations A et B soient atomiques ou non n'est pas pertinent.
Le site assert ne peut pas tirer.

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