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
обертка, которую вы иначе должны были бы написать.
Не думай, что есть. Вот ссылка, например: http://developer.apple.com/Mac/library/documentation/DriversKernelHardware/Reference/libkern_ref/OSAtomic_h/index.html