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

来源:本站
导读:目前正在解读《你了解C语言中的关键字volatile吗?》的相关信息,《你了解C语言中的关键字volatile吗?》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《你了解C语言中的关键字volatile吗?》的详细说明。
简介:我们在学习C语言的32个关键字时,大家都不太注意volatile这个关键字,volatile是一个类型修饰符。volatile的中文意思是“易变的”。那么在程序中我们在什么情况下才使用他呢?我们在分析内核时经常看到这个关键字的使用。

举例如下:

view plaincopy to clipboardprint?

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一定要知道如何使用。

提醒:《你了解C语言中的关键字volatile吗?》最后刷新时间 2024-03-14 01:00:16,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《你了解C语言中的关键字volatile吗?》该内容的真实性请自行鉴别。