这篇文章将详细介绍volatile关键字的使用。通过这篇文章将学会看懂和使用volatile关键字。
这个关键字非常简单,只要搞清楚在哪些场景下加与不加就可以。
volatile字面意思是“可变的,易变的”,也就是说用它修饰的变量的值是可以变化的。在多线程的编程中对共享变量的访问和在中断服务程序中修改其他程序中的变量以及对对特定寄地址的读写访问时经常使用这个变量。用法就是在原来定义变量的前面加上vloatile修饰符即可:比如vlolatile int i = 10;
如果一个变量的前面加上volatile这个类型修饰符,就表明编译器在访问这个变量时不对这个变量进行优化操作,也就是说编译器每次在使用这个这个变量时都会从内存中重新读取变量的值。这样做会降低一定的效率,因此在合适的场景下再使用这个修饰符,并不是在每一个变量的前面加上这个修饰符。
我们知道嵌入式系统的硬件层包含寄存器、内存、辅存(硬盘等)和高速缓存。CPU对这些访问的速度是不一样的,速度由快到慢以此是寄存器->高速 缓存->内存->硬盘 通常cpu在访问相应数据时,首先会到缓存中看有没有,没有的话再到内存中读取。因此,只要未加volatile修饰符的变量在频繁被使用时,CPU会去高速缓存中读取相应值。也有人问,既然CPU访问寄存器的速度最快,那么为什么 不将内存、缓存、辅存全部换为寄存器?烧钱啊,访问寄存器速度快但是容量小,访问硬盘速度相对慢但是容量大。所以每一种的存储介质都是有利有弊。演示代码如下图所示:
#include <stdio.h>
  • //演示未加volatile关键字
  • int main(int argc, char** argv)
  • {
  •         unsigned int i = 1;
  •         unsigned int j = i;//执行此处代码时会将变量i的值存储到高速缓存中
  •        
  •         //此时在进行k = i赋值操作时,i的值并不是从内存中取出,而是从高速缓存中取出。
  •         //如果变量i的值在别的线程中修改了,那么此时高速缓存中的i的值就不对了
  •         //因此在多线程编程中对共享变量操作时,一定要对变量加上volatile修饰符。
  •         unsigned int k = i;
  •        
  •         return 0;       
  • }
  • 复制代码
    image.png
    #include <stdio.h>
  • //演示加volatile关键字
  • int main(int argc, char** argv)
  • {
  •         volatile unsigned int i = 1;//加上volatile
  •         unsigned int j = i;
  •        
  •         //加上volatile此时在进行k = i赋值操作时,i的值从内存中取出,而非从高速缓存中取出。
  •         //如果变量i的值在别的线程中被修改了,也会刷新到内存,那么此时从内存中取值就对了
  •         unsigned int k = i;
  •        
  •         return 0;       
  • }
  • 复制代码
    image.png
    以上就是所总结的volatile的用法,这些都是必须要掌握的,上机实战,理解才是王道。
    喜欢的话给个点赞和评论