volatile的作用是什么?
举例说明:
1、写个没用的循环。
常见于单片机流水灯、蜂鸣器等对时间要求不高的地方。
这个代码的现象,应该是先输出 1,等一会,再输出 2。
编译运行,现象跟我们预期的一样。
然后再编译一次,这一次把编译器的优化选项打开,而且直接开到最高等级。
为什么要打开优化选项,很多时候还是为了提高程序的效率。
比如会去除没用的代码、优化循环结构、把常用的变量存放在寄存器中等等。
这段循环的代码,除了浪费时间,没有什么实际的意义,所以编译器会把它优化掉。
如何解决这个问题,在循环变量的前面加上 volatile,防止编译的时候被优化。
编译运行,同样打开优化,延时还是起了作用。
2、多线程
一个全局变量 flag,初始值是 1。
主函数中创建线程,然后进入 while 循环,如果 flag 一直是 1,程序会一直停在这;如果 flag 变成 0,程序会打印 end。
线程函数睡眠 1 秒,然后把 flag 修改成 0。
所以现象应该是,1 秒后答应 end。
运行程序,现象跟我们设想的一样。
再次编译,同样开启优化,这一次,直接变成了死循环,程序不会结束。
为什么线程里面把变量修改了,主线程还察觉不到。
因为优化后,程序为了提高运行效率,可能从缓存或者寄存器中读取数据,读到的还是没有修改的数据。
使用 volatile 同样可以解决问题。
再次编译,同样开启优化。运行程序,1 秒后打印 end,跟我们假设的一样。
有了 volatile,就会从内存中直接读取,一旦数据被其他线程修改,就能立马察觉。