如果多個執行緒之間只有乙個共享變數,對它的原子操作是否沒有多核可見性順序問題而永遠無需使用記憶體屏障?

時間 2021-06-03 09:29:52

1樓:饒萌

具體要看用的是什麼原子操作(什麼彙編指令或C++表示式),如果是x86架構下C++11 atomic操作,那麼編譯器已經預設加上了compiler fence,如果使用seq_cst還會加上mfence指令。

首先在題主的背景下只操作單個指標大小的變數是不需要mfence指令的。再者其實compiler fence也不需要,把變數宣告成volatile然後像單執行緒程式一樣操作它就可以了,不過要注意的是volatile變數不會快取在暫存器中,如果需要的話可以用區域性變數快取它的值。

2樓:satanson

問題1也不需要. 兩個core修改cache line高低不同區域.

前乙個core修改cache line, 已經讓這個cache line處於modified或者exclusive狀態, 後乙個core嘗試修改同乙個cache line, 此時有兩種做法:

cache-to-cache : 後者直接從前者的本地cache中獲取以修改的cache line(更加高效). (MESIF, MOESI協議)

我曾經寫過一點內容Shared Memory Concurrency Roadmap, 末尾的參考基本上可以回答問題.

3樓:原子筆

仔細閱讀你過去關於多核記憶體模型一致性異常的案例,是否至少都要有2個變數在2個執行緒之間共享讀寫修改?順序的先後是需要參照物的。沒有參照物其實你是觀察不到核間順序的變化的。

好,問題主認為光光原子操作乙個共享變數,可見性是沒有問題的。 但是如果把這個共享變數看成2個或多個小的共享變數,分開進行原子操作呢?假如這個共享變數不是原生型別但是按快取線對齊且大小小於快取線呢?

問題主認為至少在已知的x64的快取同步機制下,此時依然不應該存在順序問題。

希望得到大家的意見。

請問,多個執行緒可以讀乙個變數,只有乙個執行緒可以對這個變數進行寫,到底要不要加鎖?

陳磊 我寫了很多年的乙個寫法 主線程裡設個quit flag,其它執行緒讀這個標誌後紛紛break出while迴圈,退出執行緒,典型的你說的場景,不加鎖,我也一直糾結我這個寫法符不符合最佳實踐,希望陳碩,劉然等大牛能解答 我敢當 要加鎖。乙個原因是編譯器可能會優化讀過程,如果不加鎖,編譯器可能會改變...

乙個類只有乙個this指標。多執行緒並行程式設計對同乙個類不同物件操作為什麼不會衝突?

劉生 this指標即不是物件的成員,也不是類靜態成員,它既不屬於類也不屬於物件。他是類成員函式的的隱含引數,這也是類成員函式與普通函式的區別。既類成員函式,會比普通函式多乙個隱含的this指標引數,函式被呼叫時,物件的位址會通過這個引數傳給函式。你可以嘗試sizeof 乙個物件,你會發現沒有被thi...

現代坦克為什麼都只有乙個火炮,沒有多個炮塔的火炮嗎?可以鎖定或者攻擊多個目標的火控系統?

簡單說吧,在坦克總載重 總動力受限的情況下,多炮塔注定會分散每門主炮的口徑和殺傷力。乙個鉛球能把人砸趴下,換成同等重量的一大大大堆桌球還有什麼用? 2044 二戰中蘇聯的T35就是乙個很典型的例子。這種坦克雖然能夠同時攻擊多個目標,它有三個炮塔,一門76.2公釐火炮,兩門45公釐坦克炮,還可以安裝5...