AtomicSwap вместо AtomicCompareAndSwap? - PullRequest
1 голос
/ 13 марта 2010

Я знаю, что в системах MacOSX / PosiX существует атомарное сравнение и замена кода C / C ++ через g ++.

Однако мне не нужно сравнивать - я просто хочу атомарно поменять два значения. Доступна ли операция атомного обмена? [Все, что я могу найти, это atomic_compare_and_swap ... и я просто хочу сделать обмен без сравнения].

Спасибо!

Ответы [ 3 ]

3 голосов
/ 13 марта 2010

Инструкция сборки Intel "lock xchg", вероятно, выполняет то, что вы хотите, но я не думаю, что есть функция-обертка GCC, чтобы сделать ее переносимой. Для этого вы застряли, используя встроенную сборку (не переносимую) или используя сравнение и обмен, и заставляя сравнение быть истинным (неэффективным). Надеюсь, это поможет: -)

1 голос
/ 09 октября 2012

GCC обеспечивает эту операцию на некоторых процессорах, под (озадаченно названным) __sync_lock_test_and_set. Из документации 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.

Однако полная операция подкачки поддерживается в x86-32 и x86-64, эффективно обеспечивая оболочку lock xchg, которую в противном случае вам нужно было бы написать.

0 голосов
/ 13 марта 2010
...