如何在c ++ 11中实现CAS

时间:2015-04-11 09:15:06

标签: c++ c++11

我想知道如何在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;
}

有没有更好的方法来实现这个?

1 个答案:

答案 0 :(得分:0)

我就是这样做的:

//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类型。或“正常”指针。共享指针一般都可以:)。