Thread---重排序

排序

数据依赖性

若是两个操做访问同一个变量,且这两个操做中有一个为写操做,此时这两个操做之间就存在数据依赖性。数据依赖分下列三种类型:spa

名称线程

代码示例排序

说明ci

写后读编译器

a = 1;b = a;编译

写一个变量以后,再读这个位置。table

写后写变量

a = 1;a = 2;程序

写一个变量以后,再写这个变量。并行

读后写

a = b;b = 1;

读一个变量以后,再写这个变量。

 

上面三种状况,只要重排序两个操做的执行顺序,程序的执行结果将会被改变。

前面提到过,编译器和处理器可能会对操做作重排序。编译器和处理器在重排序时,会遵照数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操做的执行顺序。

注意,这里所说的数据依赖性仅针对单个处理器中执行的指令序列和单个线程中执行的操做,不一样处理器之间和不一样线程之间的数据依赖性不被编译器和处理器考虑。

as-if-serial语义

s-if-serial语义的意思指:无论怎么重排序(编译器和处理器为了提升并行度),(单线程)程序的执行结果不能被改变。编译器,runtime 和处理器都必须遵照as-if-serial语义。

为了遵照as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操做作重排序,由于这种重排序会改变执行结果。可是,若是操做之间不存在数据依赖关系,这些操做可能被编译器和处理器重排序。

 

volatile 关键字,禁止重排序

相关文章
相关标签/搜索