gcc内置原子操作:005fatomic-Builtins.html
我需要一个原子操作:和CAS的添加选项。它有点像gcc内置的函数__atomic_compare_exchange_n,但不同之处在于:
bool atomic_compare_add(int &ptr, int &expected, int val)
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++上实现该操作?
发布于 2017-09-15 09:30:43
谢谢大家,我有一个解决办法:
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;
}
https://stackoverflow.com/questions/46233746
复制相似问题