2

の例でboost::atomicは、unref関数:

void intrusive_ptr_release(const X * x)
{
  if (x->refcount_.fetch_sub(1, boost::memory_order_release) == 1) {
    boost::atomic_thread_fence(boost::memory_order_acquire);
    delete x;
  }
}

1: fetch_sub op は memory_order_release によって制限されます。これにより、前の操作がポイントを超えて並べ替えられるのを防ぎます。しかし、そのような現象が発生する可能性のあるシーンは何ですか?

2:アトミック opのmemory_order_releaseに加えて、削除の前に追加のmemory_order_acquireがあるのはなぜですか?

4

1 に答える 1

1

(*x)最初の質問では、 の使用が の後に並べ替えられるのを防ぎますfetch_sub(参照カウントが 0 になる可能性があり、使用が禁止されている場合)。考えられる原因は、CPU の並べ替えまたはコンパイラの並べ替えです。2 番目の質問は、リリースの鏡にすぎません。release はストアを保護し、acquire はロードを保護します。

それもrefcount_fetch_sub(1, memory_order_acq_rel)うまくいくように見えるかもしれませんが、それは参照カウントだけを保護します。

于 2014-08-14T12:00:03.793 に答える