中间值和线程安全

Intermediate Values and Thread Safety

本文关键字:安全 线程 中间      更新时间:2023-10-16

在类似:

的表达式中
a = b + c;

编译器可能会优化上述代码:

a = b;
a += c;

我真正想知道的是,其他线程是否可以在=的Lefthand侧看到中间计算的结果。

使用AS-IF规则,优化编译器可以(几乎)它喜欢的表达式与不涉及原子的表达式一样,因为没有其他线程可以观察到数据中的差异 - 无race程序。因此,是的,编译器可以做到这一点,其他线程只能通过数据竞赛看到中间结果。

我现在无法访问标准,但是根据http://en.cppreference.com/w/cpp/language/eval_order:

8)内置的副作用(左参数的修改) 分配操作员和所有内置复合分配运算符 在价值计算(但不是副作用)之后进行测序 左右参数,并在值之前进行测序 分配表达式的计算(即返回之前 对修改对象的引用)

这似乎在说a的修改是在评估b + c之后测序的,因此编译器无法分为两个步骤修改a

这不会阻止优化器执行任何内容,但是我看不出它将两次写给a的任何理由。