C++11 个原子和侵入式共享指针引用计数
C++11 atomics and intrusive shared pointer reference count
我正在编写侵入式共享指针,并且我正在使用C++11 <atomic>
工具作为参考计数器。以下是我的代码的相关片段:
//...
mutable std::atomic<unsigned> count;
//...
void
SharedObject::addReference() const
{
std::atomic_fetch_add_explicit (&count, 1u,
std::memory_order_consume);
}
void
SharedObject::removeReference() const
{
bool destroy;
destroy = std::atomic_fetch_sub_explicit (&count, 1u,
std::memory_order_consume) == 1;
if (destroy)
delete this;
}
我从memory_order_acquire
开始,先memory_order_release
,但后来我说服自己memory_order_consume
应该足够好。经过进一步的考虑,在我看来,即使是memory_order_relaxed
也应该起作用。
现在,问题是我是否可以使用memory_order_consume
进行操作,或者我可以使用较弱的排序(memory_order_relaxed
)还是应该使用更严格的排序?
void
SharedObject::addReference() const
{
std::atomic_fetch_add_explicit (&count, 1u, std::memory_order_relaxed);
}
void
SharedObject::removeReference() const
{
if ( std::atomic_fetch_sub_explicit (&count, 1u, std::memory_order_release) == 1 ) {
std::atomic_thread_fence(boost::memory_order_acquire);
delete this;
}
}
您希望使用atomic_thread_fence
,以便delete
严格在fetch_sub
之后。参考
引用链接文本:
增加参考计数器始终可以通过以下方式完成 memory_order_relaxed:只能形成对对象的新引用 从现有引用,并从现有引用传递现有引用 线程到另一个线程必须已提供任何所需的同步。
强制对对象进行任何可能的访问非常重要 线程(通过现有引用)在删除 对象在不同的线程中。这是通过"发布"来实现的 删除引用后的操作(通过 对对象的任何访问 这个引用显然必须发生在之前),以及"获得" 删除对象之前的操作。
可以使用memory_order_acq_rel进行fetch_sub 操作,但这会导致在 参考计数器尚未达到零,可能会施加性能 罚款。
相关文章:
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- 共享 C++ 的数据成员指针
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 嵌套类、继承和C++中的共享指针
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 重载流<<运算符,用于指针/共享指针和其他类型的
- RAW指针共享_ptr
- 指针共享习语
- 将memmove函数与临时指针共享相同的地址