AtomicSwap вместо AtomicCompareAndSwap?

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

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

Спасибо!

3 ответа

Решение

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

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 обертка, которую вы иначе должны были бы написать.

Другие вопросы по тегам