处理器的猜测执行(gold_axe)

2020-02-05  本文已影响0人  胖达_4b7e

https://book.douban.com/subject/27034721/

cpu的一种乱序执行

先执行if里面的内容, 再算if语句, 如果是false, 扔掉就好了

比如

public class SpeculativeLoadExample {
  
  private boolean ready = false;
  private int[] data = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };

  public void writer() {
   
    for (int i = 0; i < data.length; i++) {// 语句①(for循环语句)
      data[i] =1;
    }
    ready = true;// 语句②
  }

  public int reader() {
    int sum = 0;
    int[] snapshot;
    if (ready) {// 语句③(if语句)
      for (int datum : data) {// 语句④(for循环语句)
        sum += datum;// 语句⑤
      }

    }
    return sum;
  }
}

里面

    if (ready) {// 语句③(if语句)
      for (int datum : data) {// 语句④(for循环语句)
        sum += datum;// 语句⑤
      }
     }

sum可能会先算好(大不了ready是false不成立,就浪费一下白算)

如果是多线程执行, 一个线程执行writer, 另一个线程同时执行reader,

原来的目的是, write好了 把ready改成 true 以后, reader才可以执行里面的sum求和,
但是 因为猜测执行, 先算了sum求和
这样reader就返回了一个不符合原本预期的sum

上一篇 下一篇

猜你喜欢

热点阅读