1. volatile作用
volatile是C语言的一个关键字,该关键字的作用是保持内存的可见性
- volatile修饰的变量会防止编译器优化;
- CPU每次操作变量都会从内存读取数据;
2. sample
2.1 无修饰默认编译场景
volatile.c文件如下:
#include <stdio.h>
#include <signal.h>
int flag = 0;
void handle(int signo)
{
printf("收到一个 %d号信号\n",signo);
flag = 1;
}
int main()
{
signal(2,handle);//捕获2号信号
while(!flag);
printf("进程正常退出!\n");
return 0;
}
编译:
gcc volatile.c
运行:
./a.out
^C收到一个 2号信号 (此处需要按住ctrl+c结束运行)
进程正常退出!
2.2 编译优化
编译:
gcc volatile.c -O3
运行:
./a.out
^C收到一个 2号信号
^C收到一个 2号信号
^C收到一个 2号信号
由上可以看到ctrl+c无法结束运行
2.3 加入volatile修饰
#include <stdio.h>
#include <signal.h>
volatile int flag = 0;
void handle(int signo)
{
printf("收到一个 %d号信号\n",signo);
flag = 1;
}
int main()
{
signal(2,handle);//捕获2号信号
while(!flag);
printf("进程正常退出!\n");
return 0;
}
编译:
gcc volatile.c -O3
运行:
./a.out
^C收到一个 2号信号
进程正常退出!