读书人

volatile关键字,该怎么解决

发布时间: 2012-03-20 14:01:11 作者: rapoo

volatile关键字
今天一个人问我
volatile int i = 10;
什么意思。我只知道关于编译器的优化方面别的还不知道,他让我回去Baidu。基本上明白了,但是想找个例子,大家有什么好例子,用volatile和不用volatile的

[解决办法]
volatile的作用楼主查过,我就不解释了

某些人说volatile基本没什么能直接使用的情况,这是有道理

比如,对于一般的内置整数类型,操作系统和一些程序库都会直接提供原子操作的api,这种原子操作效率比你自己加锁要高,而他们的传入参数一般是volatile,所以无论你传进去的是不是volatile,都会按照volatile处理,通常没有自己写volatile的必要。

Linux内核文档的编程规范有类似的观点,不提倡使用volatile,具体的描述和理由,你可以下个内核源码看看,里面Document目录下就有编程规范,而且还有中文的版本

所以,目前为止,虽然写过一些很复杂的多线程程序,但从没有手动声明过volatile变量
[解决办法]
我觉得这篇博客里例子不错:
http://blog.21ic.com/user1/2949/archives/2007/35599.html
volatile还是在嵌入式中用的多一些。
[解决办法]
只在《C和指针》里看到过,没用过,所以已经又还给书了
[解决办法]
4#说的不错,这个说明符一般就是在多线程时当做一个标志来用的,但仍不是线程安全的,要加锁
[解决办法]
不加的话有可能读到脏数据吧。
[解决办法]

探讨

可能多个线程同时访问的内容没什么特殊情况必须有volatile修饰。

volatile的意思是一个左值不管读取还是写入必须直接对内存进行,否则经过编译器优化可能会变成直接在寄存器中进行。就是说如果你不加volatile,一个线程修改了一个变量,写的可能只是一个寄存器,而另一个线程读取这个变量读的就是内存中没改过的值,甚至是它自己寄存器中的更错误的内容。

并不是只有原子操作涉及的内容可……

[解决办法]
volatile最常见的含义是:volatile所修饰的变量,使用时都要从内存中获取,而不能让CPU偷懒(当然前提是编译器做了这样的优化,CPU不会擅自作主)去寄存器里面拿,保证任何线程所用到的值都是最新的。

读书人网 >C语言

热点推荐