C++增量 std::atomic_int 如果为非零

C++ increment std::atomic_int if nonzero

本文关键字:如果 int 增量 std atomic C++      更新时间:2023-10-16

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

  • 检查强引用计数器是否不为零
  • 如果是这样,请递增它
  • 知道是否有某些事情发生了变化。

有没有办法使用 std::atomic_int 来做到这一点?我认为必须可以使用其中一种compare_exchange,但我无法弄清楚。

给定定义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将保留以前的值。请注意,如果失败,compare_exchange_weak将更新以前的版本。

这应该可以做到:

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;
}
相关文章: