第一个问题,为什么不在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操作?
答案 0 :(得分:2)
如果将++作为第三个参数传递,则在函数调用开始时,a保持递增的值(请参阅order of evaluation)。 由于该值不再等于原子的值,因此C ++ CAS从原子读取并写入第二个参数,这使得它看起来好像增量“没有发生”。
检查CAS返回的值。