我想知道如何在c++ 11中实现compare_and_swap。
这是我尝试过的:

template<typename T>
T compare_and_swap(atomic<T>& reg,T newVal )
{
    bool success = false;
    T oldVal;
    do
    {
        oldVal = reg.load();
        success = reg.compare_exchange_weak(oldVal,newVal);
    }while(!success);
    return oldVal;
}

有没有更好的方法来实现这一目标?

最佳答案

这就是我将如何做到的:

//untested code
template<typename T>
T compare_and_swap(atomic<T>& reg,T newVal )
{
     oldVal = atomic_load(reg);
     while(!atomic_compare_exchange_weak(&reg, &oldVal, newVal));
     return oldVal;
}

如果失败,比较交换函数将更新 oldval 值。因此没有必要重复这一点。

如您所见,我更喜欢使用显式原子操作。这是因为并不总是实现完整的。正如 Herb Sutter here 所解释的那样(视频的其余部分也可能会让您感兴趣:))。

作为一个可能不必要的事后想法,我想警告不要将此函数与非 trivially copyable 类型一起使用。或“正常”指针。共享指针通常没问题:)。

关于c++ - 如何在C++ 11中实现CAS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29576134/

10-15 04:25