汉扬编程 C语言入门 volatile关键字的作用

volatile关键字的作用

1.volatile关键字是防止在共享的空间发生读取的错误。只保证其可见性,不保证原子性;使用volatile指每次从内存中读取数据,而不是从编译器优化后的缓存中读取数据,简单来讲就是防止编译器优化。

volatile关键字的作用

2.在单任务环境中,如果在两次读取变量之间不改变变量的值,编译器就会发生优化,会将RAM中的值赋值到寄存器中;由于访问寄存器的效率要高于RAM,所以在需要读取变量时,直接寄存器中获取变量的值,而不是从RAM中。

3.在多任务环境中,虽然在两次读取变量之间不改变变量的值,在一些情况下变量的值还是会发生改变,比如在发生中断程序或者有其他的线程。这时候如果编译器优化,依旧从寄存器中获取变量的值,修改的值就得不到及时的响应(在RAM还未将新的值赋值给寄存器,就已经获取到寄存器的值)。

4.要想防止编译器优化,就需要在声明变量时加volatile关键字,加关键字后,就在RAM中读取变量的值,而不是直接在寄存器中取值。

C语言小知识点 volatile 关键字

LiteOS中使用volatile关键字的示例:

volatile关键字的作用

kernel\\base\\los_tick.c:

LITE_OS_SEC_BSS volatile UINT64 g_tickCount[LOSCFG_KERNEL_CORE_NUM] = {0};这个关键字有什么作用呢?

在C/C++语言中,使用 volatile 关键字声明的变量具有三种特性:易变的、不可优化的、顺序执行的。

易变的易变性体现在:假设有读、写两条语句,依次对同一个 volatile 变量进行操作,那么后一条的读操作不会直接使用前一条的写操作对应的 volatile 变量的寄存器内容,而是重新从内存中读取该 volatile 变量的值。

不可优化的“不可优化性”指的是,volatile 会告诉编译器,不要对 volatile 声明的变量进行各种激进的优化(甚至将变量直接消除),从而保证程序员写在代码中的指令一定会被执行。

顺序执行的“顺序执行的特性”能够保证 volatile 变量间的顺序性,不会被编译器进行乱序优化。

##:

参考 ://blog.csdn.net/liitdar/article/details/86063883

volatile关键字详解

一 简介在程序设计中,尤其是在C语言、C++、C#和Java语言中,使用volatile关键字声明的变量或对象通常具有与优化、多线程相关的特殊属性。通常,volatile关键字用来阻止(伪)编译器认为的无法“被代码本身”改变的代码(变量/对象)进行优化。如在C语言中,volatile关键字可以用来提醒编译器它后面所定义的变量随时有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。

volatile关键字的作用

Java中的“volatile关键字”: 在 JDK1.2 之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而在当前的 Java 内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值得拷贝,造成数据的不一致。

要解决这个问题,就需要把变量声明为 volatile,表示这个变量是不稳定的,每次使用它都到主存中进行读取。

闲聊 c语言中的volatile关键字

volatile 关键字 用在 什么场合? 就是用来 读写外设上的 寄存器的。一般c语言的变量,编译以后,是存储在 memory 里的。地址也是编译器 自己分配的。而外设,比如 一个 实时时钟的 时间,在寄存器里存储着,也可以映射到 memory 的 地址 空间,这时候读写 这个时钟,就要在变量前边 加 volatile 关键字。为什么 外设的 读写,变量前边要 加 volatile呢? 本质上 是因为 一般的 变量,程序没有修改它,变量的 值 自己不会变,而外设 寄存器,比如实时时钟,自己在不断变化,程序没有写,这次读和下次读,读出来的值就不一样了。就是在这一点上,和一般的非 volatile 变量区分开来了。

具体原理,就是一般的变量,前边没有加volatile 关键字的,程序运行时,为了提高速度,有可能读到 cache 里,程序读时,直接从cache 里读,这是不会有问题的,因为没有修改,变量值不会自己变。 但是 如果是 实时时钟,从cache 里读,是会出问题的,因为体现不出值最新的 变化,所以需要每次 从 memory 总线上 直接按地址读,不能缓存到cache.

而 变量前边 加 volatile 关键字,其实就是 告诉 cpu 不要 把这个 变量 缓存到 cache 里

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/cjia/6531.html

C|volatile关键字使用细节及适用场合

面试官必问的8道volatile关键字命题,你答对了吗?

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部