如果非零,则C ++递增std :: atomic_int

时间:2012-12-19 10:08:50

标签: c++ c++11 atomic

我正在使用std::atomic s为参考计数器实现指针/弱指针机制(如this)。为了将弱指针转换为强指针,我需要原子地

  • 检查强参考计数器是否为非零
  • 如果是,请递增
  • 知道是否有变化。

有没有办法使用std::atomic_int执行此操作?我认为必须使用其中一个compare_exchange,但我无法弄明白。

2 个答案:

答案 0 :(得分:3)

给定定义std::atomic<int> ref_count;

int previous = ref_count.load();
for (;;)
{
    if (previous == 0)
        break;
    if (ref_count.compare_exchange_weak(previous, previous + 1))
        break;
}

previous将保留之前的值。请注意,如果{1}}失败,compare_exchange_weak将更新。

答案 1 :(得分:1)

这应该这样做:

bool increment_if_non_zero(std::atomic<int>& i) {
    int expected = i.load();
    int to_be_loaded = expected;

    do {
        if(expected == 0) {
            to_be_loaded = expected;
        }
        else {
            to_be_loaded = expected + 1;
        }
    } while(!i.compare_exchange_weak(expected, to_be_loaded));

    return expected;
}