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 關鍵字,禁止重排序

相關文章
相關標籤/搜索