这个问题专门针对引用计数指针中的可微破坏类型。请参见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;
}
我们知道,由于memory_order_release
,x
的所有读/写操作都在fetch_sub
之前完成(请参阅here)。因此,如果我们碰巧到达A
点,那么x
的所有使用都将完成。
在代码中的点A
上,我们并不能保证在x
栅栏之后才能看到memory_order_acquire
的最新值。
这是我关于第二个关于memory_order_acquire
的问题:
当x
指向简单可破坏的类型时(例如int
,其中x
是int * const
),memory_order_acquire
毫无意义吗?我的理由是,如果x
可以被轻易破坏,那么对x
的最新更改不会影响x
的删除吗?
例如,删除线程的delete x;
是否看到最新的x
使得*x = 10
还是过时的值使得*x = 8
销毁过程始终相同,无论(只要指针x
本身保持不变)。它知道没有人会因为发行版而修改x
,所以它要做的就是释放。
这里缺少我memory_order_acquire
的另一个好处吗?
我的想法是否正确?如果不正确,为什么我们需要在删除线程上查看x
的最新值?
答案 0 :(得分:0)
不可能!
您似乎相信障碍是能够实现的工具
但这只是使用原子和势垒的一个例子。
通常,与宽松的原子操作相关的障碍使相互排斥得到了很好的定义。互斥锁是一个互斥设备,一个null而不是非null的原子指针是另一个,而引用计数又是另一个。
引用计数的功能类似于RW锁,具有:
(RC = 0)观察与锁定操作类似,因为它必须与属性(RC> 0)互斥。对于需要排除的每个计算系列,互斥转换为释放获得对。 RC设备控制的所有数据用户都需要与内存释放(不是互斥释放)操作互斥。