为什么C11 CAS操作需要两个指针参数?

前端之家收集整理的这篇文章主要介绍了为什么C11 CAS操作需要两个指针参数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
许多C11 CAS操作(例如,atomic_compare_exchange_weak,atomic_compare_exchange_strong)取两个指针和一个值,即:
  1. bool atomic_compare_exchange(T* pointer,T* expected,// pseudodeclaration!
  2. T desired);

相比之下,来自Microsoft,gcc和Intel的CAS操作都采用一个指针和两个值:

  1. long InterlockedCompareExchange(long* pointer,long desired,// Microsoft
  2. long expected);
  3.  
  4. int __sync_bool_compare_and_swap (T* pointer,T expected,// gcc and
  5. T desired); // Intel

为什么C11 CAS函数需要两个指针和一个值,而不是一个更常规的一个指针和两个值呢?

解决方法

C 11方式更有用:如果交换失败,则*预期将更新为新的当前值.这使得在循环中使用该功能变得容易:
  1. T value = x.load();
  2. T newvalue = frob(value);
  3.  
  4. while (!atomic_compare_exchange(&x,&value,newvalue))
  5. {
  6. newvalue = frob(value);
  7. }

使用Microsoft签名,测试操作是否成功是否更为繁琐,并且同样适用于GCC的__sync_type版本.使用GCC的__sync_bool,您甚至每次交换失败时都需要执行另一个负载.

猜你在找的C&C++相关文章