为什么在参考计数器上需要内存顺序限制?

时间:2014-08-14 09:06:38

标签: c++ boost atomic refcounting

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

1 个答案:

答案 0 :(得分:1)

对于第一个问题,它阻止在(*x)之后重新排序使用fetch_sub(当引用计数可能为0且因此禁止使用时)。可能的原因是CPU重新排序或编译器重新排序。第二个问题只是发布的镜像; release可保护商店并获得保护负载。

似乎refcount_fetch_sub(1, memory_order_acq_rel)也可以正常工作,但这只会保护引用计数。