2

在 的示例中boost::atomicunref函数:

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

4

1 回答 1

1

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

看起来也refcount_fetch_sub(1, memory_order_acq_rel)可以,但这仅保护了引用计数。

于 2014-08-14T12:00:03.793 回答