【发布时间】:2017-11-15 12:03:15
【问题描述】:
例如,假设我们有如下代码,其中d 是一个字典或其他数据结构,其索引并不重要:
x = d[a]
y = d[b]
z = (x + y) * (x + y)
return z + d[a]
优化编译器是否可以有效地将最后一行更改为return z + x?
如果是这样,这种优化在存在多个线程的情况下是否无效?当这个线程正在计算z 的值时,如果另一个线程改变了d[a] 的值(甚至类型)会发生什么?
【问题讨论】:
-
是的。让另一个线程修改值而不提供必要的同步是 UB。
-
@HansPassant +1 并且它必须是 UB,因为获取值 d[a] 可能需要几条指令,并且如果在中间中断会返回一半修改的数据
-
直接支持线程(而不是作为附加组件)的语言必须在此处定义整个语义。将其作为插件的语言通常会提供某种插件同步或屏障操作,然后必须提供一种方法来确保编译器不会进行无效优化。例如,考虑提供线程本地存储的语言(您可以在其中声明 d 本身,也许 d 的所有存储项目都是线程本地的,因此优化是有效的)。
-
只要这个问题被标记为[与语言无关],就无法提供有意义的答案。这是“太宽泛”的定义。每种语言都有不同的规范,可以或不能解释这一点,因此每种语言都允许优化器做不同的事情。
标签: multithreading compiler-construction language-agnostic compiler-optimization