AtomicSwap au lieu de AtomicCompareAndSwap?
-
19-09-2019 - |
Question
Je sais que sur les systèmes MacOSX / Posix, il est atomique comparer et-échange pour le code C / C ++ via g ++.
Cependant, je ne pas besoin de comparer - Je veux juste échanger atomiquement deux valeurs. Y at-il une opération d'échange atomique disponible? [Everythign je peux trouver est atomic_compare_and_swap ... et je veux juste faire l'échange, sans comparer].
Merci!
La solution
l'instruction de montage intel « lock xchg » atteint probablement ce que vous voulez, mais je ne pense pas qu'il existe une fonction wrapper de GCC pour le rendre portable. Votre coincé à cet effet à l'aide assembleur en ligne (non portable) ou à l'aide de comparer et d'échanger et de forcer le comparer à être vrai (inneficient). Espérons que cela aide: -)
Autres conseils
GCC fournit cette opération sur certains processeurs, sous le (nom de prêter à confusion) __sync_lock_test_and_set
. De la documentation GCC:
This builtin, as described by Intel, is not a traditional test-and-set operation, but rather an atomic exchange operation. It writes VALUE into `*PTR', and returns the previous contents of `*PTR'. Many targets have only minimal support for such locks, and do not support a full exchange operation. In this case, a target may support reduced functionality here by which the _only_ valid value to store is the immediate constant 1. The exact value actually stored in `*PTR' is implementation defined.
Cependant, l'opération d'échange complet est pris en charge sur x86-32 et x86-64, fournissant efficacement l'emballage de lock xchg
vous auriez besoin autrement écrire.