の例で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があるのはなぜですか?