在引用计数中指向普通可销毁类型的memory_order_acquire是否多余?

时间:2019-11-08 22:04:47

标签: c++ c++11 memory-barriers stdatomic

这个问题专门针对引用计数指针中的可微破坏类型。请参见Boost's documentation中有关原子使用的示例。

减量如下:

if (x->refcount_.fetch_sub(1, boost::memory_order_release) == 1) {
  // A
  boost::atomic_thread_fence(boost::memory_order_acquire);
  delete x;
}
  1. 我们知道,由于memory_order_releasex的所有读/写操作都在fetch_sub之前完成(请参阅here)。因此,如果我们碰巧到达A点,那么x的所有使用都将完成。

  2. 在代码中的点A上,我们并不能保证在x栅栏之后才能看到memory_order_acquire的最新值。

这是我关于第二个关于memory_order_acquire的问题:

x指向简单可破坏的类型时(例如int,其中xint * const),memory_order_acquire毫无意义吗?我的理由是,如果x可以被轻易破坏,那么对x的最新更改不会影响x的删除吗?

例如,删除线程的delete x;是否看到最新的x使得*x = 10还是过时的值使得*x = 8销毁过程始终相同,无论(只要指针x本身保持不变)。它知道没有人会因为发行版而修改x,所以它要做的就是释放。

这里缺少我memory_order_acquire的另一个好处吗? 我的想法是否正确?如果不正确,为什么我们需要在删除线程上查看x的最新值?

1 个答案:

答案 0 :(得分:0)

不可能!

您似乎相信障碍是能够实现的工具

  • 在线程中发布数据结构,通常在原子指针(Java易失性引用的模拟)上具有释放/存储
  • 检查发布是否发生(加载原子指针并检查值)并读取数据(加载/获取)

但这只是使用原子和势垒的一个例子。

通常,与宽松的原子操作相关的障碍使相互排斥得到了很好的定义。互斥锁是一个互斥设备,一个null而不是非null的原子指针是另一个,而引用计数又是另一个。

引用计数的功能类似于RW锁,具有:

  • RC增量= R锁定
  • RC减量= R解锁
  • 减少= W锁定后观察(RC = 0)

(RC = 0)观察与锁定操作类似,因为它必须与属性(RC> 0)互斥。对于需要排除的每个计算系列,互斥转换为释放获得对。 RC设备控制的所有数据用户都需要与内存释放(不是互斥释放)操作互斥。

相关问题