[問題] Volatile陷阱

作者: yshihyu (yshihyu)   2015-08-13 23:33:11
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;
}
謝謝
作者: Feis (永遠睡不著 @@)   2015-08-13 23:34:00
這題目有點眼熟阿. 坦白說. 有哪個實際函式庫這樣用嗎?
作者: EdisonX (卡卡獸)   2015-08-13 23:36:00
作者: fatrabitree (胖兔子)   2015-08-14 01:26:00
MTK萬年考古題之一不過如果要像題目一樣的Scenario,我會直接宣告var為int
作者: nowar100 (拋磚引玉)   2015-08-14 08:01:00
取兩次 就算在memory也有可能被改 用multithread角度想
作者: Killercat (殺人貓™)   2015-08-14 09:24:00
我還是覺得問題在於這題目出得不好 XD
作者: gigigigi (gigigigi)   2015-08-14 14:50:00
multithread 不是應該加上 mutex lock 嗎? ,

Links booklink

Contact Us: admin [ a t ] ucptt.com