我正在使用std::atomic
s为参考计数器实现指针/弱指针机制(如this)。为了将弱指针转换为强指针,我需要原子地
有没有办法使用std::atomic_int
执行此操作?我认为必须使用其中一个compare_exchange
,但我无法弄明白。
答案 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;
}