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

luc*_*nte 8 c++ atomic c++11

我正在使用std::atomics为参考计数器实现一个指针/弱指针机制(像这样).为了将弱指针转换为强指针,我需要原子化

  • 检查强引用计数器是否非零
  • 如果是这样,增加它
  • 知道是否有变化.

有没有办法使用std::atomic_int?我认为必须使用其中之一compare_exchange,但我无法弄明白.

yme*_*ett 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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • @NoSenseEtAl `compare_exchange_weak` 通过引用获取 `previous` 并更新它,因此不需要执行另一个 `ref_count.load()`。 (2认同)