就像你们更熟悉的const同样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不一样线程访问和修改的变量。若是没有volatile,基本上会致使这样的结果:要么没法编写多线程程序,要么编译器失去大量优化的机会。程序员
1,做用web
1 XBYTE[2]=0x56; 2 XBYTE[2]=0x57; 3 XBYTE[2]=0x58;
对外部硬件而言,上述四条语句分别表示不一样的操做,会产生四种不一样的动做,可是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。若是键入volatile,则编译器会逐一的进行编译并产生相应的机器代码(产生四条代码).面试
2,几个例子多线程
intsquare(volatileint*ptr)
{
return
*ptr**ptr;
}
intsquare(volatileint*ptr)
{
inta,b;
a=*ptr;
b=*ptr;
returna*b;
}
longsquare(volatileint*ptr)
{
inta;
a=*ptr;
returna*a;
}
1
|
volatileintvint;
|
1
2
3
|
volatileinti=10;
inta=i;
//...
|
1
|
intb=i;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include<stdio.h>
voidmain(intargc,
char
*argv[])
{
inti=10;
inta=i;
printf
(
"i=%d"
,a);
//下面汇编语句的做用就是改变内存中i的值,可是又不让编译器知道
__asm
{
movdwordptr[ebp-4],20h
}
intb=i;
printf
(
"i=%d"
,b);
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include<stdio.h>
voidmain(intargc,
char
*argv[])
{
volatileinti=10;
inta=i;
printf
(
"i=%d"
,a);
__asm
{
movdwordptr[ebp-4],20h
}
intb=i;
printf
(
"i=%d"
,b);
}
|
1
|
for
(inti=0;i<100000;i++);
|
1
|
for
(volatileinti=0;i<100000;i++);
|
1
2
3
4
5
6
7
8
9
10
11
|
staticinti=0;
intmain(
void
)
{
//...
while
(1)
{
if
(i)dosomething();
}
}
/*Interruptserviceroutine.*/
voidISR_2(
void
){i=1;}
|