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

時間 2021-06-04 12:41:59

1樓:陳磊

我寫了很多年的乙個寫法: 主線程裡設個quit_flag, 其它執行緒讀這個標誌後紛紛break出while迴圈,退出執行緒,典型的你說的場景,不加鎖,我也一直糾結我這個寫法符不符合最佳實踐,希望陳碩,劉然等大牛能解答

2樓:我敢當

要加鎖。乙個原因是編譯器可能會優化讀過程,如果不加鎖,編譯器可能會改變語句的執行順序;另乙個原因是多核處理器,每個處理器都有自己的快取,如果執行緒在不同的處理器上執行,乙個的寫入操作在同步的記憶體之前對另外乙個執行緒是不可見的。

3樓:石超

基本上用 volitile 非布林型變數做執行緒間同步都有時序問題。(我指隨手寫的那種,精心設計的無鎖資料結構不算。)老老實實用條件變數吧。

4樓:原子筆

如果這些讀執行緒之間,除了這個變數之外沒有別的任何直接或者間接的通訊(比如說2個執行緒都在往乙個tcp連線上發訊息,可以認為他們通過tcp對端進行間接的通訊),那麼這種「髒」讀是沒有任何問題的。

但是我不認為你能做出上面那樣的保證,所以還是推薦你兩眼一抹黑,鎖上吧。

5樓:蘭威舉

可以不加鎖,但是要加 memory fence.

標準 C++ 裡加 fence 的唯一方法是 「用 atomics」 和/或 「加鎖」,當然如果允許非標準擴充套件,也可以內聯彙編或 intrinsics。

C 語言多年不用已忘。

6樓:

如果想跨平台,奧夫考斯要加鎖,題主需要補點memory model的知識,http://

7樓:Sinaean Dean

1. 什麼都不用做,正常使用就行

條件是:(1)對齊 (2)資料大小小於sizeof(void *), (3)充許髒讀(實時性要求不高)

2. 在第一條的基礎上不允許髒讀,需要加volatile。

3. 在第二條的基礎上(1)(2)任意一條不滿足,需要使用原子操作。

一些其他問題:

1. 原子操作算不算加鎖?不算

2. 什麼時候需要memory barrier?如果考慮多個這樣的變數就要考慮,單變數不需考慮。

8樓:Rob Zhang

加鎖的目的有兩個:防止非原子操作造成的資料錯誤和通過CPU屏障和編譯屏障解決資料亂序訪問及在不同CPU上的可見性問題。所以題主說的因為賦值操作對應兩條彙編指令所以需要加鎖我認為是不太正確的。

根據題主的意思,我們猜測(假定)對該變數的讀寫都是原子的,剩下的問題就是需要根據程式邏輯判斷是非能夠容忍不同變數(邏輯上有依賴關係的變數)亂序訪問及多核下可見性的問題了

9樓:

你的問題簡直就是為了read write lock而設計的。具體是read write spin lock還是read write semaphore 或者其他的就看具體情況了。

10樓:孫勇

在當前的計算機體系結構上,ILP32或ILP64系統上int是可以不鎖的,LP64系統上是long可以不鎖,而且都要求位址是對齊的,當然在程式中要宣告為volatile防止編譯器優化…

11樓:陳碩

我不負責任地總結一句:凡是在網上問要不要加鎖的,答案一律是要加鎖,沒有例外。

)為了避免扯皮(原子操作算不算加鎖?),第一句話的「加鎖」應該理解為「同步/synchronization」。其實我認為 atomic operations are dangerous,或者用 Herb Sutter 的話來說,是 Juggling Razor Blades,一般程式設計師老老實實用 mutex 就好了。

我知道會有很多人不同意我的觀點,而且會有各路專家站出來證明某種情況下不加鎖也是可行的,不必費力說服我,你們開心就好了。

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

饒萌 具體要看用的是什麼原子操作 什麼彙編指令或C 表示式 如果是x86架構下C 11 atomic操作,那麼編譯器已經預設加上了compiler fence,如果使用seq cst還會加上mfence指令。首先在題主的背景下只操作單個指標大小的變數是不需要mfence指令的。再者其實compile...

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

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

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

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