许多C++ 11 CAS操作(例如atomic_compare_exchange_weak
和atomic_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/