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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top