在 的示例中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 操作受memory_order_release的限制,这可以防止先前的操作在该点之后重新排序。但是有哪些可能的场景会出现这种现象呢?
2: atomic op上除了memory_order_release之外,为什么删除前多了个memory_order_acquire?