你了解C语言中的关键字volatile吗?

简介:   我们在学习C语言的32个关键字时,大家都不太注意volatile这个关键字,volatile是一个类型修饰符。volatile的中文意思是“易变的”。那么在程序中我们在什么情况下才使用他呢?我们在分析内核时经常看到这个关键字的使用。

   我们在学习C语言的32个关键字时,大家都不太注意volatile这个关键字,volatile是一个类型修饰符。volatile的中文意思是“易变的”。那么在程序中我们在什么情况下才使用他呢?我们在分析内核时经常看到这个关键字的使用。举例如下:

  1. struct task_struct {  
  2.         volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */  
  3.         void *stack;  
  4.         atomic_t usage;  
  5.         unsigned int flags;     /* per process flags, defined below */  
  6.         unsigned int ptrace;  
  7. .......  

struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; atomic_t usage; unsigned int flags; /* per process flags, defined below */ unsigned int ptrace; .......

       在应用程序中,volatile主要是被设计用来修饰被不同线程访问和修改的变量。

       volatile的变量是说这变量可能会被意想不到地改变,因此编译器不要进行相应的优化。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

      例如:

      extern int a;//语句1  假设a是一个全局变量

     ......

      int b=a; //语句2

      int c=a;  //语句3

 

      语句2与语句3中都使用了a的值,优化器在语句3中引用a的值时,认为语句2中已经将a的值读到寄存器中了,并且在语句2与语句3之间没有对a进行修改,因此没必要再到内存中去读a的值,所以直接使用了寄存器中的值。但是如果在语句3执行前,产生了中断,中断恰好对a进行了修改。那么语句3取出来的值就有问题了。

      如果上面的全局变量a是被修饰为volatile的话,那么优化器就不能去优化语句3,要到内存中去重新取值。

 

     作为嵌入式系统程序员,volatile一定要知道如何使用。

相关文章
|
7月前
|
缓存 NoSQL 编译器
C语言的本质(四):volatile限定符
C语言的本质(四):volatile限定符
47 0
|
9天前
|
缓存 安全 编译器
【C语言】volatile 关键字详解
`volatile` 关键字在 C 语言中用于防止编译器对某些变量进行优化,确保每次访问该变量时都直接从内存中读取最新的值。它主要用于处理硬件寄存器和多线程中的共享变量。然而,`volatile` 不保证操作的原子性和顺序,因此在多线程环境中,仍然需要适当的同步机制来确保线程安全。
39 2
|
5月前
|
C语言
|
5月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
6月前
|
存储 C语言
C语言中的typedef关键字:为类型定义新名称
C语言中的typedef关键字:为类型定义新名称
|
6月前
|
C语言
深入探索C语言中的sizeof关键字
深入探索C语言中的sizeof关键字
|
6月前
|
存储 编译器 C语言
C语言中的关键字与标识符详解
C语言中的关键字与标识符详解
140 0
|
7月前
|
算法 编译器 API
C语言易混淆、简单算法、结构体题目练习、常见关键字总结-1
C语言易混淆、简单算法、结构体题目练习、常见关键字总结
|
7月前
|
安全 编译器 C语言
C语言中的const关键字
C语言中的const关键字
61 2
|
7月前
|
存储 C语言
【C语言】数据:数据类型关键字
【C语言】数据:数据类型关键字