2016-06-04 4 views
0

Supposons que je l'extrait de code suivant:modification des valeurs atomiques afin détendue

std::atomic<int> a(0); 

void thread1() 
{ 
    int x = a.fetch_add(1, std::memory_order_relaxed); 
    std::cout << x << std::endl; 
} 

void thread2() 
{ 
    int x = a.fetch_add(1, std::memory_order_relaxed); 
    std::cout << x << std::endl; 
} 

int main() 
{ 
    std::thread t1(thread1); 
    std::thread t2(thread2); 

    t1.join(); 
    t2.join(); 
} 

La question est: puis-je obtenir 0 0 en conséquence?

Ici, les deux threads lisent et modifient a dans un ordre mémoire détendu, il semble donc que tous les deux peuvent voir la valeur zéro de a. Mais en pratique, je ne vois que 0 1 ou 1 0.

+0

La commande relaxée concerne le (manque de) synchronisation. Votre code n'a aucun problème de synchronisation. Les opérations Atomic RMW doivent toujours être correctes même lorsqu'elles ne sont pas commandées. –

Répondre

2

Non, 0 0 n'est pas possible. Un ordre de mémoire relâché ne signifie pas que les opérations ne sont pas atomiques, et que la seule façon pour que 0 0 se produise est que les opérations read-modify-write soient non atomiques. Mais puisque std::atomic::fetch_add fonctionne atomiquement, nous savons qu'un seul fetch_add peut fonctionner à la fois, donc seulement 0 1 ou 1 0 sont possibles.