2009-03-21 7 views
4

J'ai trouvé lock inc addr mais cela ne conserve pas une copie de la valeur stockée et même une lecture immédiatement après dans le même thread pourrait venir après une écriture concurrente. La meilleure solution que j'ai trouvée est une boucle load/inc/cas.Est-ce que x86 a un incrément atomique qui conserve la valeur qui a été stockée?

+0

En C++ 11 std :: atomic, ['fetch_add'] (http://en.cppreference.com/w/cpp/atomic/atomic/fetch_add)' + 1' fait ce que vous voulez. Ou plus simplement, ['operator ++'] (http://en.cppreference.com/w/cpp/atomic/atomic/operator_arith), mais vous ne pouvez pas utiliser un memory_order_relaxed plus faible pour le rendre plus rapide x86 si vous n'avez pas besoin d'une barrière. ('lock xadd' implémente' fetch_add', en retournant l'ancienne valeur). –

+0

[Peut num ++ être atomique pour 'int num'?] (Https://stackoverflow.com/q/39393850/995714) –

Répondre

11

lock xadd est votre ami.

3

Voir atomic_impl.h pour plus d'informations sur les primitives atomiques x86/x86_64 et leur utilisation.

Questions connexes