如何实现原子操作?

时间:2017-09-15 07:10:44

标签: c++ memory memory-barriers

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. 函数执行原子if (ptr != expected) { ptr = ptr + val; return true; } else { return false; }

  3. 我想要的功能是不同来自__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 ++上实现该操作?

1 个答案:

答案 0 :(得分: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;
}