單線程的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;
}
相關文章
相關標籤/搜索