C 11記憶體模型

2021-07-09 10:21:55 字數 1305 閱讀 8466

一、幾種同步關係:

1. 執行緒內部的資料關係:

1.1 sequenced before:

這是表示式與表示式之間的一種配對的不對稱的關係,僅用於同乙個執行緒內。實際執行順序不能破壞語句間sequenced before的關係。([1]的1.9.13)

1.2 carries a dependency to:

僅用於同乙個執行緒內。當某個表示式a中的某個值被用作另乙個表示式b的運算元,即a carries a dependency to b(排除一些特殊情況,如kill_dependency、邏輯與邏輯或條件表示式的做運算元、逗號表示式)或者通過sequenced before關係和carries a dependency to可以推導出的表示式之間的關係。([1]的1.10.9)

這種關係是sequenced before關係的子集。

2. 執行緒間的資料關係(inter-thread before):

2.1 synchronizes-with:

不同執行緒之間同步關係。使用的是store-release/load-acquire。

2.1 dependency-order-before:

是一種關係弱於synchronizes-with的同步關係,使用的是store-release/load-consume。兩者不同見下文部分。

3. 關係彙總:

二、記憶體順序:

記憶體順序主要有四種場景,單執行緒/執行緒間,順序/亂序。

1. 多執行緒順序:

這是最強的一種順序約束,同乙個原子的操作使用memory_order_seq_cst,即使在不同執行緒中,也可以保證該原子順序的一致性,會在所有執行緒之間進行全域性同步。詳細**見[3]清單5.4。

2. 鬆散操作:

當不同原子操作使用memory_order_relaxed,即使在相同執行緒,也無法保證每個原子操作產生的值的順序。這是最鬆散的原子操作順序。

3. 單執行緒場景:

c 11 記憶體模型解讀

說到記憶體模型,首先需要明確乙個普遍存在,但卻未必人人都注意到的事實 程式通常並不是總按著照原始碼中的順序一一執行,此謂之亂序,亂序產生的原因可能有好幾種 編譯器出於優化的目的,在編譯階段將原始碼的順序進行交換。程式執行期間,指令流水被 cpu 亂序執行。inherent cache 的分層及重新整...

C 11 多工記憶體模型

記憶體模型 一般來說,記憶體模型可以分為靜態記憶體模型和動態記憶體模型 c 11的記憶體模型 std memory order就是c 11的記憶體模型。c 11為std atomic提供的memory order enum class memory order 雖然列舉定義了6個,但它們表示的是4種...

簡介記憶體模型與C 11的memory order

先看一段 include include int a 0 int b 0 void func1 void func2 intmain void 再看一段彙編 1 load reg3,1 將立即數1放入暫存器reg3 2 move reg4,reg3 將reg3的資料放入reg4 3 store re...