8

std::atomic参照カウンターに s を使用してポインター/弱いポインターメカニズムを実装しています(このように)。弱いポインターを強いポインターに変換するには、原子的にする必要があります

  • 強い参照カウンターがゼロでないかどうかを確認します
  • もしそうなら、それを増やします
  • 何かが変わったかどうかを知る。

を使用してこれを行う方法はありstd::atomic_intますか? のいずれかを使用して可能にする必要があると思いますが、compare_exchangeわかりません。

4

2 に答える 2

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前の値を保持します。compare_exchange_weak失敗した場合は以前に更新されることに注意してください。

于 2012-12-19T11:10:30.413 に答える
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;
}
于 2012-12-19T11:11:00.460 に答える