gpt4 book ai didi

c++ - 原子 CAS 中的后缀评估

转载 作者:行者123 更新时间:2023-11-28 02:36:19 29 4
gpt4 key购买 nike

第一个问题,为什么不在 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 操作?

最佳答案

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

检查 CAS 返回的值。

关于c++ - 原子 CAS 中的后缀评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27306688/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com