中间价值和线程安全

时间:2014-01-21 22:56:47

标签: c++ thread-safety

表达式如下:

a = b + c;

编译器是否可能优化上面的代码:

a = b;
a += c;

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

2 个答案:

答案 0 :(得分:1)

使用as-if规则,优化编译器可以(几乎)使用不涉及原子的表达式(几乎)做任何事情,因为没有其他线程可以观察到无数据竞争程序中的差异。所以是的,编译器可以做到这一点,其他线程只能通过数据竞争看到中间结果。

答案 1 :(得分:-1)

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

  

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

这似乎是在评估a之后对b + c的修改进行了排序,因此编译器无法分两步修改a

这并不妨碍优化器做任何它喜欢的事情,但我看不出它会写入a两次的任何理由。