在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:除了原子操作上的 memory_order_release 之外,为什么在删除之前会有额外的 memory_order_acquire ?
答案 0 :(得分:1)
对于第一个问题,它阻止在(*x)
之后重新排序使用fetch_sub
(当引用计数可能为0且因此禁止使用时)。可能的原因是CPU重新排序或编译器重新排序。第二个问题只是发布的镜像; release可保护商店并获得保护负载。
似乎refcount_fetch_sub(1, memory_order_acq_rel)
也可以正常工作,但这只会保护引用计数。