许多C++ 11 CAS操作(例如atomic_compare_exchange_weakatomic_compare_exchange_strong)都有两个指针和一个值,即像这样:

bool atomic_compare_exchange(T* pointer, T* expected,       // pseudodeclaration!
                             T desired);

相比之下,Microsoft,gcc和Intel的CAS操作都采用一个指针和两个值:
long InterlockedCompareExchange(long* pointer, long desired,       // Microsoft
                                long expected);

int __sync_bool_compare_and_swap (T* pointer, T expected,          // gcc and
                                  T desired);                      // Intel

为什么C++ 11 CAS函数采用两个指针和一个值,而不是看起来更传统的一个指针和两个值?

最佳答案

C++ 11方法更有用:如果交换失败,则*expected将更新为新的当前值。这样可以轻松地在循环中使用该函数:

T value = x.load();
T newvalue = frob(value);

while (!atomic_compare_exchange(&x, &value, newvalue))
{
    newvalue = frob(value);
}

使用Microsoft签名,测试操作是否成功更加麻烦,并且与GCC的__sync_type版本相同。使用GCC的__sync_bool,每次交换失败时,您甚至都需要执行另一个加载。

关于c++ - 为什么C++ 11 CAS操作需要两个指针参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16043723/

10-11 18:40