AtomicSwap вместо AtomicCompareAndSwap?
-
19-09-2019 - |
Вопрос
Я знаю, что в системах MacOSX/PosiX существует атомарное сравнение и замена кода C/C++ через g++.
Однако мне не нужно сравнение — я просто хочу атомарно поменять местами два значения.Доступна ли операция атомарного обмена?[Все, что я могу найти, это атомное_сравнение_и_своп...и я просто хочу сделать замену, без сравнения].
Спасибо!
Решение
инструкция сборки 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
обертку, которую вам в противном случае пришлось бы написать.