原子 CAS 中的后缀评估

Postfix evaluation within atomic CAS

本文关键字:后缀 评估 CAS 原子      更新时间:2023-10-16

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

代码:

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

具有以下输出:

0 0 
1

当我期望此输出时:

0 1
2

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

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

检查 CAS 返回的值。