盲猜原子變數 記憶體屏障 記憶體模型 鎖之間的關係

2022-05-04 22:00:10 字數 1425 閱讀 3033

1、atomic_flag 和atomic<>的區別,atomic_flag 無論無鎖是多大代價(一些cpu可能無鎖代價大),都保證atomic_flag 是無鎖的。atomic<>會視情況,可能是有鎖的也可能是無鎖的,哪個開銷小選哪個。

2、c++記憶體模型可以被看作是c++程式和計算機系統(包括編譯器,多核cpu等可能對程式進行亂序優化的軟硬體)之間的契約,它規定了多個執行緒訪問同乙個記憶體位址時的語義,以及某個執行緒對記憶體位址的更新何時能被其它執行緒看見。c++11 中的 atomic library 中定義了以下6種語義來對記憶體操作的行為進行約定,這些語義分別規定了不同的重排規則(即插入記憶體屏障的規則,作為同步點

同步)。雖然共有 6 個選項,但它們表示的是三種記憶體模型:

typedef enum memory_order  memory_order;

memory_order_relaxed 只要求在同一執行緒中,對同一原子變數的訪問不可以被重排,不插記憶體屏障,最寬鬆。
memory_order_acquire 和 memory_order_release 是一對的,memory_order_acq_rel同時包括這一對,原子變數寫之後的所有寫操作才能執行,原子變數讀之前的所有讀操作都會執行好,
memory_order_consume 原子變數讀之前的相關具有依賴性的資料的讀操作都會執行好
memory_order_seq_cst 最嚴格。嚴格按照順序來

mscv簡化了區別

memory_order_relaxed:

void store_relaxed_4(volatile _uint4_t *_tgt, _uint4_t _value)

memory_order_release:

void store_release_4(volatile _uint4_t *_tgt, _uint4_t _value)

memory_order_seq_cst:

void store_seq_cst_4(volatile _uint4_t *_tgt, _uint4_t _value)

memory_order_relaxed:

_uint4_t load_relaxed_4(volatile _uint4_t *_tgt)

memory_order_consume:

memory_order_acquire:

memory_order_seq_cst:

inline _uint4_t _load_seq_cst_4(volatile _uint4_t *_tgt)

3、個人理解,鎖由原子變數和記憶體屏障實現,原子變數和記憶體屏障是硬體支援的。

4、如果直接使用鎖來保護資料,則不用考慮記憶體模型,但如果使用原子變數、無鎖演算法追求更高的效能,則需要考慮好記憶體模型。

5、記憶體模型由記憶體屏障體現

記憶體屏障 volatile 鎖 final

1.硬體層的記憶體屏障 load barrier 和 store barrier 作用 阻止屏障兩側的指令重排序 強制把寫緩衝區 快取記憶體中的髒資料等寫回主記憶體,讓快取中相應的資料失效。對於load barrier來說,在指令前插入load barrier,可以讓快取記憶體中的資料失效,強制從新...

我們是不是真的需要鎖和記憶體屏障

使用共享的可寫字段但是不使用鎖或者記憶體屏障通常會引起麻煩。在這個問題上有許多誤導資訊,包括msdn文件,msdn上說明了,對於memorybarrier僅僅在弱記憶體順序的多核系統中使用,比如乙個系統使用多個安騰處理器。我們可以用一段 來演示記憶體屏障對於普通的intel core 2和奔騰處理器...

c 記憶體模型,變數和函式

1 c 中方法 儲存在單獨的方法表中,fuction table,類中有方法指標來指向方法表中方法的實際位址,static和nonstatic 方法都儲存在方法表中。2 c 中類的物件的 成員變數存在class中,static 變數儲存在class之外。3 c 的成員指標式類似slot 插槽式設計,...