[问题] 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