单线程的as-if-serial语义

单线程的as-if-serial语义

关于指令重排序有个问题不明白的一个问题多线程

int a = 2;
int c = 1 + a; 
float b = 3f / 2f;
  1. 举个栗子,从CPU的设计者以及编译器的设计者角度来看,上面第3行代码彻底能够放到第1行代码以前运行,且不会影响程序的正确性(as-if-serial)。线程

  2. float b = 3f / 2f; 从处理器的角度来看,若是当前处理器在执行第2行代码(CPU处于占用状态),而接下来这第3行代码的运算彻底能够交给FPU(FPU处于空闲状态),那么何乐而不为 先把第3行代码提交给FPU(浮点运算器)去执行呢,反正结果出来以后,并不会影响程序的正确性,并且相比一行一行运行代码,闲置的FPU 提早加入运算工做能够明显减小程序运行的总时间,由于FPU跟CPU能够并行。设计

  3. 从多线程的角度来看,下面这行代码就会存疑,由于单线程的as-if-serial 在多线程下运行的时候就会产生意想不到的错误。code

if (b == (3f/2f)){
      assert c==3;
}
相关文章
相关标签/搜索