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 插槽式設計,...