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;
}