[回到版面]
回應模式
名 稱
內 文
附加圖檔[] []
  • 可附加圖檔類型:GIF, JPG, JPEG, PNG, WEBM,瀏覽器才能正常附加圖檔
  • 附加圖檔最大上傳資料量為 3072 KB。
  • 當檔案超過寬 125 像素、高 125 像素時會自動縮小尺寸顯示
  • 目前附加圖檔使用量大小: 175965 KB / 500000 KB
  • 回覆時程式碼縮排會被trim消掉,請善用[code][/code]標色或貼到ideone等網站
  • LaTeX記法可以用「$$」或「\( \)」包起來,例如「$\sum_{k=1}^{k=n} k^2 = \frac{n(n+1)(n+2)}{6}$」
  • 投稿時請點擊畫像認證後,再按下 [送出] 按鈕提交。
  • 鬧板、攻擊性發言、煽動性發言請無視(回應者也無視),並使用del或在貓管理部向管理員回報。
  • 新介面尚處於測試階段,如果有任何問題可以向管理員或於程設交流版反映。

檔名:1554450541710.jpg-(76 KB, 600x545)
76 KB
無題無名19/04/05(五)15:49:01 ID:bvUqH8bsNo.13199del
突然想到一個多執行緒的問題
通常不同執行緒要讀寫同一份資料時會使用讀寫鎖去確保資料正確性
即使只是一個32bit整數也要鎖
以免讀到正在覆寫修改中的數據

但是boolean呢?
雖然體積有8bit
但實際上只有1bit是真正重要的
1個bit就只會有兩種值
那是不是對boolean變數就不用鎖了?
無名19/04/05(五)18:08:08 ID:6lB11ULUNo.13200del
整數要鎖不是因為bit會錯亂
是一行程式碼會被切成很多指令
而不同執行緒的這些指令可能是交錯的

例如i++實際上會被轉譯成類似這樣的邏輯
int reg=i;
reg++;
i=reg;

reg在不同執行緒中是分開存在的
因為硬體原理的關係,i不能直接++,只有reg才可以
而當兩條執行緒同時執行上述程式,實際順序可能是:
int reg0=i;
int reg1=i;
reg0++;
i=reg0;
reg1++;
i=reg1;

結果會變成i只++了一次

這樣的現象在布林裡面也會發生
所以布林不代表就不用鎖
實際上要不要鎖還是得看你做了什麼操作
你不會判斷那就全鎖吧

一個整數的32個bit在硬體處理時應該都是綁死一起走的,不會跟別的執行緒混在一起
無名19/04/05(五)19:05:17 ID:bvUqH8bsNo.13201del
>>13200
但是boolean單純賦值應該只有一個指令吧?
沒有計算
單純用等號塞值進去

>>你不會判斷那就全鎖吧
要鎖的話是不是這樣最便宜啊?
std::atomic<bool> reg;
無名19/04/05(五)19:27:45 ID:6lB11ULUNo.13202del
>>13201
單純的賦值不會被拆開,int也不會
但還是有其他操作可能會
例如boolean=!boolean;
無名19/04/06(六)12:05:08 ID:kFgmBgcgNo.13203del
>>13199
總覺得你知道為什麼有data race
但第二段概念又很奇怪

會不會錯亂看的也只是底層指令怎麼運作 大於一個就有出錯機會
文章概念看起來很像你以為寫32bit是從第一個bit寫到最後一個bit,中間被讀寫才造成錯亂
而布林只會改一個bit(一次動作)所以絕對正確
實際上不是這樣 硬體運算不是以bit為單位在跑


【刪除文章】[]
刪除用密碼: