杂记 C中的volatile

简介:

volatile

  就象大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。(摘自 百度百科)

 

  volatile 影响编译器编译的结果,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错。

  

告诉compiler不能做任何优化

  

表示用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能把他放在cache或寄存器中重复使用。

 

笔试常见问题

1)一个参数既可以是const还可以是volatile吗?解释为什么。 
2); 一个指针可以是volatile 吗?解释为什么。 
3); 下面的函数有什么错误: 
int square(volatile int *ptr) 

return *ptr * *ptr; 
}

1)是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变,所以在使用时候需要从内存中直接读取,而它是const是因为程序不应该试图去修改它。(完全是两个概念,一个是读取并不改变,改变是由于程序有可能对它造成改变,而const是为了不允许程序去改变它。) 
2); 是的。尽管这并不很常见。一个例子是当一个中断服务子程序修该一个指向一个buffer的指针时。 
3) 这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码: 
int square(volatile int *ptr) 

int a,b; 
a = *ptr; 
b = *ptr; 
return a * b; 

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下: 
long square(volatile int *ptr) 

int a; 
a = *ptr; 
return a * a; 
}

参考

http://www.cnblogs.com/chio/archive/2007/11/24/970632.html

知识共享许可协议
本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012

相关文章
|
4月前
|
传感器 缓存 安全
volatile 相关整理
volatile 相关整理
46 0
|
5月前
|
缓存 Java
并发编程系列教程(03) - Volatile
并发编程系列教程(03) - Volatile
23 0
|
8月前
|
存储 安全 Java
第二季:1请你谈谈你对volatile的理解【Java面试题】1
第二季:1请你谈谈你对volatile的理解【Java面试题】1
272 0
|
8月前
|
SQL 缓存 安全
第二季:1请你谈谈你对volatile的理解【Java面试题】2
第二季:1请你谈谈你对volatile的理解【Java面试题】2
34 0
|
9月前
|
存储 缓存 Java
java顶级内功心法(1) —— 可见性、MESI、volatile精讲 (8000字由浅入深)(2)
java顶级内功心法(1) —— 可见性、MESI、volatile精讲 (8000字由浅入深)
264 0
java顶级内功心法(1) —— 可见性、MESI、volatile精讲 (8000字由浅入深)(2)
|
9月前
|
存储 缓存 安全
java顶级内功心法(1) —— 可见性、MESI、volatile精讲 (8000字由浅入深)(1)
java顶级内功心法(1) —— 可见性、MESI、volatile精讲 (8000字由浅入深)
230 0
|
存储 Java 编译器
重学Volatile
并发,是多个线程去访问同一个资源;并行,各种事情同时在做。 volatile是java虚拟机提供的**轻量级**的**同步机制** 三大特性,保证可见性,不保证原子性,禁止指令重排序 先说下JMM(java内存模型Java Memory Model)本身是一种抽象的概念并不是真实存在的,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。
41 0
|
SQL 缓存 安全
Java并发编程学习系列七:深入了解volatile关键字
Java并发编程学习系列七:深入了解volatile关键字
103 0
Java并发编程学习系列七:深入了解volatile关键字
|
SQL 缓存 Java
Java - 面试官最爱的 volatile 关键字
Java - 面试官最爱的 volatile 关键字
108 0
Java - 面试官最爱的 volatile 关键字
|
缓存 Java
Java并发编程系列2 - volatile
主要讲解volatile的相关知识,以及容易遇到的坑。
143 1
Java并发编程系列2 - volatile

热门文章

最新文章