它是被设计用来修饰被不一样线程访问和修改的变量。若是没有volatile,基本上会致使这样的结果:要么没法编写多线程程序,要么编译器失去大量优化的机会。多线程
volatile的语法和const是同样的。可是volatile的意思是:“在编译器认识的范围外,这个数据能够改变”。不知何故,环境正在改变数据(可能经过多任务、多线程或者中断处理),因此,volatile告诉编译器不要擅自做出有关该数据的任何假定,优化期间尤为如此。ide
就行创建const对象同样,程序猿也能够创建volatile对象,甚至还能够创建const volatile对象,这个对象不能被客户程序猿改变。可是,能够经过外部的代理程序改变。函数
#include "stdafx.h" class Comm { const volatile unsigned char byte; volatile unsigned char flag; enum { bufsize = 100 }; unsigned char buf[bufsize]; int index; public: Comm(); void isr() volatile; char read(int index) const; }; Comm::Comm(): index(0), byte(0), flag(0) { } void Comm::isr() volatile { flag = 0; buf[index++] = byte; if(index >= bufsize) index = 0; } char Comm::read(int index) const { if(index<0 || index>= bufsize) return 0; return buf[index]; } int _tmain(int argc, _TCHAR* argv[]) { volatile Comm port; port.isr();// OK //port.read(0); //Error read() not volatile return 0; }
就像const 同样,咱们能够对数据成员和函数成员和对象自己使用volatile,能够对volatile对象调用volitile函数。优化
问题:1). 一个参数既能够是const还能够是volatile吗?解释为何。线程
int square(volatile int *ptr) { return *ptr * *ptr; }
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; }