AtomicSwap invece di AtomicCompareAndSwap?
-
19-09-2019 - |
Domanda
So che su sistemi / POSIX MacOSX, non v'è atomico-compare-and-swap per C / C ++ di codice via g ++.
Tuttavia, non ho bisogno del confronto - Voglio solo atomicamente scambiare due valori. C'è un'operazione di swap atomica disponibili? [Everythign che posso trovare è atomic_compare_and_swap ... e voglio solo fare lo swap, senza confrontare].
Grazie!
Soluzione
l'istruzione "bloccare xchg" assemblea intel probabilmente realizza quello che volete, ma io non credo che ci sia una funzione GCC wrapper per renderlo portabile. Perciò il vostro bloccato utilizzando assembly inline (non portatile) o utilizzando confrontare e scambiare e costringendo il confronto per essere vero (inneficient). Spero che questo aiuta: -)
Altri suggerimenti
GCC invece fornisce questa operazione su alcuni processori, sotto il (confusamente chiamato) __sync_lock_test_and_set
. Dalla documentazione 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.
Tuttavia, il funzionamento a pieno di swap è supportato su x86-32 e x86-64, fornendo in modo efficace l'involucro lock xchg
si sarebbe altrimenti bisogno di scrivere.
Non credo che ci sia. Ecco il riferimento, btw: http://developer.apple.com/Mac/library/documentation/DriversKernelHardware/Reference/libkern_ref/OSAtomic_h/index.html#//apple_ref/doc/header/user_space_OSAtomic.h