原子 CAS 中的后缀评估
Postfix evaluation within atomic CAS
第一个问题,为什么后缀评估 (++) 不应用于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 返回的值。
相关文章:
- std::condition_variable::wait()如何评估给定的谓词
- 增量运算符与后缀混淆
- c++11评估顺序(未定义的行为)
- 如何在OpenSSL库的名称中添加后缀'd'?
- 如何使用"equal to"以外的评估编写开关语句
- 嵌套 if 中没有返回评估
- 懒惰的参数评估try_emplace?
- C++17 十六进制浮点文字单精度后缀冲突?
- C++ 后缀评估问题
- 堆栈后缀表示法评估等于中缀计算得到的不同
- 使用C 中的STL评估后缀表达
- 为什么在后缀评估中尝试减法时不起作用?
- 后缀评估算法
- 使用堆栈评估后缀表达式时出现分段错误
- 中缀到后缀转换器 + 评估程序正确打印到控制台,但不正确地打印到文本文件
- 如何从C++中的文件读取到队列中进行后缀评估
- 原子 CAS 中的后缀评估
- 后缀评估
- 使用堆栈进行后缀评估
- 以下代码片段中 push(po[i]-'0') 对评估后缀表达式的重要性是什么