相当于 Java 的 AtomicMarkableReference 的 C++ 11 原子库是什么

2023-12-23

需要这个调用来实现无锁链表。 AtomicMarkableReference 是 java.util.concurrent.atomic 包中的一个对象,它封装了对 T 类型对象的引用和布尔标记。这些字段可以一起或单独原子更新。

谢谢。


假设对象的对齐方式大于1,您可以使用指针的最后一位作为布尔标记:

template<class T>
class MarkableReference
{
private:
    uintptr_t val;
    static const uintptr_t mask = 1;
public:
    MarkableReference(T* ref = NULL, bool mark = false)
    {
        val = ((uintptr_t)ref & ~mask) | (mark ? 1 : 0);
    }
    T* getRef(void)
    {
        return (T*)(val & ~mask);
    }
    bool getMark(void)
    {
        return (val & mask);
    }
};

为了执行原子操作,您需要从此类创建原子变量。例如,如果由引用指向的对象类型应该是int,您可以创建这个变量:

atomic<MarkableReference<int>> mRef;

对于变量mRef您可以应用任何适用于普通原子的操作。例如,比较并设置 (CAS):

int a;
int b;
...
// Atomically change pair (&a, true) to (&b, false).
MarkableReference<int> old = mRef.load();
if(old == MarkableReference(&a, true))
{
    if(mRef.compare_exchange_strong(old, MarkableReference(&b, false)))
    {
        // Successful CAS
    }
}
// 'old' contains other value. (Unsuccessfull CAS)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

相当于 Java 的 AtomicMarkableReference 的 C++ 11 原子库是什么 的相关文章

随机推荐