[問題] Volatile陷阱

看板C_and_CPP作者 (yshihyu)時間8年前 (2015/08/13 23:33), 編輯推噓2(206)
留言8則, 6人參與, 最新討論串1/2 (看更多)
http://adrianhuang.blogspot.tw/2011/08/cvolatile.html #include <stdio.h> int square(volatile int *var) { return *var **var; } int main(void) { int var = 5; printf("result: %d\n", square(&var)); return 0; } 程式碼我是看這網站 其問題在於square函式的平方算式,*var**var,此指令代表到var位址讀取其內容。然而 ,var位址可能儲存硬體暫存器,這些暫存器內容會隨時間而改變 (例如: 狀態暫存器), 有可能第一次讀取的時候為4, 下一次讀取為5, 導致計算出來的值不正確。 可是前面又提到 凡牽涉讀取該volatile變數的操作,保證會到該變數的實體位址讀取,而不會讀取CPU暫 存器的內容 (提升效能) , 這樣這程式碼變數加上 volatile 都會從記憶體取值,這樣不是沒問題? 怎麼感覺講法有衝突,還是我誤解他意思? 他說正確解法是在square函式宣告一local變數 int square(volatile int *var) { int local_var = *var; return local_var * local_var; } 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 175.182.129.233 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1439479996.A.CB2.html

08/13 23:34, , 1F
這題目有點眼熟阿. 坦白說. 有哪個實際函式庫這樣用嗎?
08/13 23:34, 1F

08/13 23:36, , 2F
08/13 23:36, 2F

08/14 01:26, , 3F
MTK萬年考古題之一
08/14 01:26, 3F

08/14 01:30, , 4F
不過如果要像題目一樣的Scenario,我會直接宣告var為
08/14 01:30, 4F

08/14 01:30, , 5F
int
08/14 01:30, 5F

08/14 08:01, , 6F
取兩次 就算在memory也有可能被改 用multithread角度想
08/14 08:01, 6F

08/14 09:24, , 7F
我還是覺得問題在於這題目出得不好 XD
08/14 09:24, 7F

08/14 14:50, , 8F
multithread 不是應該加上 mutex lock 嗎? ,
08/14 14:50, 8F
文章代碼(AID): #1LpBYyoo (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1LpBYyoo (C_and_CPP)