就像你們更熟悉的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;}
|