當前位置:成語大全網 - 書法字典 - 如何理解C++11的六種內存順序

如何理解C++11的六種內存順序

從程序員的角度來看;

雖然有六種,但對四種同步的理解差不多。

1.松散排序:在壹個線程中,所有原子操作都是順序執行的。按什麽順序?這基本上是壹個排序前。這是唯壹的限制!來自不同線程的兩個原子操作的順序是什麽?兩個字:任何。

2.

發布-獲取:

來自不同線程的兩個原子操作的順序不壹定?那我們怎麽限制他們的順序呢?這需要兩個線程相互同步。同步什麽?

同步對變量的讀寫操作。線程A原子性地將值寫入X(釋放),然後線程B原子性地讀取X的值(獲取)。

這樣,線程b保證讀取x的最新值。註意,release - acquire有壹個可怕的副作用:線程a中的所有事情都發生在release X中。

在線程B獲取x之後,之前的寫操作對於任何讀操作都是可見的!本來A和B之間的讀寫操作順序是不確定的。利用這種同步,圍繞點X,

線程A和B之間有壹個順序關系,稱為線程間出現-之前。

3.釋放-

消費者:我去。我只是想同步壹個X的讀寫操作,結果在發布前同步了所有的寫操作?如果我想避免這筆額外的費用呢?使用

釋放-消費。同步還是那個同步,這次副作用稍微弱了壹點:線程B獲取x後的壹些讀操作依賴於x。

值的讀取操作。稱這些X相關的讀操作為。同樣,在線程A中,釋放x。

還有壹些它所依賴的其他寫操作,這些寫操作自然發生在x版之前,稱這些寫操作為a寫,現在這個副作用就是只有B讀。

我能看見阿來在寫東西。(臥槽真累)

有人問,什麽是數據依賴?事實上,這個事情極其簡單:

S1。c = a+b;

S2。e = c+d;

S2數據依賴於S1,因為它需要c的值

4.順序壹致性:理解了前面的,順序壹致性就最好理解了。Release - acquire同步壹個x,相同的順序意味著所有變量上的所有原子操作都是同步的。這樣,該死的,所有的原子操作都像是被壹個線程按順序執行。

但是,壹致的順序是x86體系結構的默認內存模型...妳想寫壹個順序寬松的程序,但是妳做不到!!

嘗試輕松點餐的簡單方法就是拿出手機。寫個小程序,故意留個競態條件,然後放到iPhone上。

或者安卓手機升級,不需要release - acquire保證出錯。但是,即使使用模擬器,您也無法在x86主機上調優這個bug。