如何在c ++ 11中实现CAS

Ant*_*ron 5 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;
}
Run Code Online (Sandbox Code Playgroud)

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

lau*_*svr 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;
}
Run Code Online (Sandbox Code Playgroud)

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

正如您所看到的,我更喜欢使用显式原子操作。这是因为完整的并不总是得到实施。正如赫伯·萨特 (Herb Sutter)在这里所解释的那样(您可能也会对视频的其余部分感兴趣:))。

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