原子CAS中的后缀评估

时间:2014-12-05 00:17:24

标签: c++ multithreading atomic

第一个问题,为什么不在atomic_compare_exchange_weak操作的参数中应用后缀评估(++)? a的值在操作之前和之后是相同的。但是,当在printf()中使用时,如预期的那样,值会递增。

代码:

int main(){
  atomic<int> s(0);
  int a = 0;
  atomic_compare_exchange_weak(&s,&a,a++);
  printf("%d %d\n",s.load(),a++);
  printf("%d\n",a);
}

具有以下输出:

0 0 
1

当我预料到这个输出时:

0 1
2

其次,我想使用后缀评估来测试多线程情况下的原子操作顺序,这是我的方法在一些悲剧性方面存在缺陷吗?例如,即使增量运算符确实有效,在第一次CAS和增量评估之间是否会发生另一次CAS操作?

1 个答案:

答案 0 :(得分:2)

如果将++作为第三个参数传递,则在函数调用开始时,a保持递增的值(请参阅order of evaluation)。 由于该值不再等于原子的值,因此C ++ CAS从原子读取并写入第二个参数,这使得它看起来好像增量“没有发生”。

检查CAS返回的值。