在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 ?
最佳答案
对于第一个问题,它防止在(*x)
之后重新排序fetch_sub
的任何使用(当引用计数可能为0并因此被禁止使用时)。可能的原因是CPU重新排序或编译器重新排序。第二个问题只是发布的镜像。发布可以保护商店,而获取则可以保护 cargo 。
似乎refcount_fetch_sub(1, memory_order_acq_rel)
也可以正常工作,但这仅保护了引用计数。
关于c++ - 为什么在引用计数器上需要存储顺序限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25304201/