C++11 个原子和侵入式共享指针引用计数

C++11 atomics and intrusive shared pointer reference count

本文关键字:指针 共享 引用 C++11      更新时间:2023-10-16

我正在编写侵入式共享指针,并且我正在使用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 操作,但这会导致在 参考计数器尚未达到零,可能会施加性能 罚款。