- 论坛徽章:
- 0
|
原帖由 飞雪横天 于 2008-3-7 10:08 发表 ![]()
看了这篇文章, 我倒是对volatile的理解更加糊涂了.
不同线程中对同一个变量的访问也需要使用volatile么? 这样的话,对我的打击也太大了点.
我以前可是经常在一个线程通过设置一个全局变量通知另外一个 ...
看着都着急, 你这么想就明白了.
编译器在进行对源码编译过程中,通常会对反复使用的变量整个逼本到reg当中从而提高访问速度.由volatile声明的变量,实际上就是通知编译器该变量会以你意想不到的方式被更改,所以你丫别优化我. 那么编译器意想不到的方式有哪几种呢,如下:
1.Memory map的硬件寄存器(比如). 状态寄存器是最常见, 你想呀, 硬件修改这变量他会告诉编译器嘛, 不会也没这能力, 那编译器不就傻呵呵的把该变量优化了嘛, 一优化就坏事了, 因为我们读到的都是reg中存储的旧的状态寄存器的值, 而非memory当中最新的状态寄存器值. 抄个定义给你看看: #define rIICSTAT (*(volatile unsigned *)0x54000004) //IIC status
2.多线程中被几个线程共享的变量. 线程修改共享变量var会通知编译器嘛,不会也没这能力,所以线程A使劲读着var在reg中的副本(狗日的编译器优化),读出来1时他好大展鸿图呀,结果读出来的都是0, 而线程B早就把var变量给修改为1了,怪谁呀,只怪没加volatile,加上volatile不早就读memory当中的var新值1了嘛.
3.ISR当中用.这个麻烦,需要拿程序举例,俺就不写了.
再有, 讨论volatile就讨论volatile. 跟cache有嘛关系, cache是不可见的...不可见的...我看不着~~~ |
|