1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| int a = 0;
volatile int b = 1;
atomic_int c = 0;
void fct () {
a = 3;
b = 4; // 'b' est volatile : on est sûr que LE thread fera a=3 avant b=4 et ensuite b--
// sans cela l'optimiseur pourrait directement écrire 3 dans 'b'
// les autres processeurs peuvent eux voir 'a' modifié après 'b'.
b--;
c++; // 'c' est atomique, si 2 threads appellent fct() "en même temps" 'c' vaudra 2
// sans cela, les 2 c++ simultanés pourraient tous les 2 écrire 1 dans 'c'.
atomic_store( &b , a ); // force un accès memory_order_seq_cst, TOUS les threads verront 'a' copié
// dans 'b' après c++ et avant a--;
// si on faisait b=a, le volatile ne garantirait ceci que pour LE thread.
a--;
atomic_store( &b , a , memory_order_release ); // les AUTRES thread qui lisent la valeur écrite ici dans 'b'
// sont sûr que le résultat a-- est écrit en RAM de tous les processeurs
// ici on ne garantit effectuées que les actions causes de 'b' (donc 'a' est en RAM)
} |