Как реализовать атомарную операцию?

GCC-встроенная атомарная операция:
http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html

Мне нужен атомная операция:Дополнение с CAS. Это немного похоже на встроенную функцию gcc __atomic_compare_exchange_n, но отличается:

  1. прототип функции просто так: bool atomic_compare_add(int &ptr, int &expected, int val)

  2. функция выполняется atomicly : if (ptr != expected) { ptr = ptr + val; return true; } else { return false; }

Функция, которую я хочу разные от __atomic_compare_exchange_n и __atomic_add_fetch, __atomic_compare_exchange_n означает if (*ptr == *expected) { *ptr = desire; return true; } else { return false; } и __atomic_add_fetch означает *ptr = *ptr + val; return *ptr;,

Как реализовать эту операцию в Linux gcc / g ++?

0

Решение

Спасибо всем, у меня есть одно решение:

bool atomic_compare_add(int *ptr, int not_expected, int val) {
int old_val;
do {
old_val = __atomic_load_n(ptr, __ATOMIC_CONSUME);
if (old_val == not_expected) {
return false;
}
} while (!__atomic_compare_exchange_n(ptr, &old_val, old_val + val, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED));
return true;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]