中间值和线程安全
Intermediate Values and Thread Safety
在类似:
的表达式中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
的任何理由。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在std::thread中,joinable()然后join()线程安全吗
- 在c++队列中使用pop和visit实现线程安全
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程安全运算符<<
- 如何使缓存线程安全
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 提升精神 V2 Qi 语法线程安全吗?
- 线程调用的函数对对象删除是否安全?
- asio 链对象线程安全吗?
- 线程安全队列 c++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具