c++ - 为什么在引用计数器上需要存储顺序限制?

标签 c++ boost atomic memory-model 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

最佳答案

对于第一个问题,它防止在(*x)之后重新排序fetch_sub的任何使用(当引用计数可能为0并因此被禁止使用时)。可能的原因是CPU重新排序或编译器重新排序。第二个问题只是发布的镜像。发布可以保护商店,而获取则可以保护 cargo 。

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

关于c++ - 为什么在引用计数器上需要存储顺序限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25304201/

相关文章:

c++ - 关于从内存中释放链表的析构函数的逻辑和范围的问题

c++ - 如何从 std::vector<string> 构造 std::string?

c++ - 使用IAudioSessionManager时出现链接错误

c++ - boost::interprocess 互斥量并检查是否被遗弃

c - 如何在 C 中一次原子地读取多个变量?

c++ - C++类网络编程的段错误

c++ - boost 事件系统

c++ - 在 C++ 中处理 boost 线程竞争条件

c - 原子加法运算与多线程多变量对比(C 语言)

c++ - 为什么 std::atomic 初始化不进行原子释放,以便其他线程可以看到初始化值?