Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top