重排序
重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。
数据依赖性
如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据的依赖性。数据依赖分为3中类型,如下表所示:
上面3中情况,只要重排序两个操作的顺序。程序的结果就会改变。编译器和处理器是可以对操作进行重排序的,在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。这里说的数据依赖性只针对单个处理器中执行的指令序列和单个线程中执行的操作,不同处理器之间和不同线程之间的数据依赖是不能被编译器和处理器考虑的。
as-if-serial语义
as-if-serial语义的意思是:不管怎样重排序,当然我们知道,重排序的目的是为了提高编译器和处理器的并行度,单线程的程序的执行结果不会被改变,这一点要注意,上面也提到了,这里的重排序针对的是单线程情况。编译器,runtime和处理器都必须遵守as-if-serial语义。为了遵守as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变程序执行结果。但是,如果操作之间不存在数据依赖关系,这些操作就可以被编译器和处理器重排序。
看如下代码:
double pi = 3.14; // A
double r = 1