volatile 实战 - 使用信号实现 sleep 函数

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<signal.h>
#include<unistd.h>

static int sleepFlag = 1;

static void alrm_handler(int signo){
sleepFlag = 0;
}

int mySleep(int sec)
{
signal(SIGALRM,alrm_handler);
alarm(sec);

while(sleepFlag);

return 0;
}

开启优化选项后,程序变成了死循环。从下面的汇编代码,不难发现编译器优化了 sleepFlag 的读取,导致了死循环。

不开启优化
O3 优化

volatile 使用场景总结 [1]

在中断服务程序中进行修改的共享变量

上面中 sleepFlag 就是一个很好的例子。

多线程间共享的变量

对硬件寄存器[2]进行映射的变量

1
2
3
4
5
6
7
8
9
int  *output = (unsigned  int *)0xff800000;//定义一个IO端口;
int init(void)
{
int i;
//会被优化为 *output = 9
for(i=0;i< 10;i++){
*output = i;
}
}

参考


volatile 实战 - 使用信号实现 sleep 函数
http://blog.soul11201.com/2024/06/17/volatile/
作者
soul11201
发布于
2024年6月17日
许可协议