C语言中的volatile关键字

来源:互联网 发布:360搜索引擎推广 知乎 编辑:程序博客网 时间:2024/05/16 04:46

其实我自己写程序就没有碰到过volatile的问题,但是人家也是一个关键字,肯定有它存在的意义。再说我也没干过嵌入式低层多线程的工作,没碰到也是正常的。也有可能我水平太low,哈哈。

 volatile是告诉编译器对它所修饰的对象别执行优化。volatile在进行多线程编程时要注意,而在在单线程中那就是只能起到限制编译器优化的作用。 如果一个变量被volatile修饰,编译器将不会把它保存到寄存器中,而是每一次都去访问内存中实际保存该变量的位置上的值。这样就避免了没有volatile修饰的变量在多线程的读写中所产生的由于编译器优化所导致的问题。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。例如下面:

volatile int flag = 1;while(flag){   ...}

while的条件就不会被编译器当作无条件真。而是每次都去内存中看一下这个flag的值是不是为真。有哥们总结了volatile的作用,我照着理解写一下了。


 1 不会在两个操作之间把volatile变量缓存在寄存器中。在多任务、中断、甚至setjmp环境下,变量可能被其他的程序改变,volatile就是告诉编译器这种情况。
 2 不做常量合并、常量传播等优化。
 3 对volatile变量的读写不会被优化掉。如果你对一个变量赋值但后面没用到,编译器常常可以省略那个赋值操作,然而对Memory Mapped IO的处理是不能这样优化的。

基本上就是这样,没说到点子上的话,主要原因在于我没有这个方面的使用体会。


有一个常见的问题:const volatile int i=10这行代码有没有问题?如果没有,那到底i是什么属性。

答:“volatile”的含义是“请不要做没谱的优化,这个值可能变掉的”,而“const”含义是“请做为常量使用”,那么它们本来就不是矛盾的。那么什么情景下会这样用嘞?可以这么试着理解:如果一个变量不会被本程序改变,通常可能给它加上const,但如果该变量可能被其他程序改变而本程序又在检测这个变量的值,就需要给它加上volatile,于是变量就同时有volatile和const了。


0 0
原创粉丝点击