浅析volatile关键字

为什么会有volatile关键字呢?
首先我们先来了解一下程序优化处理
程序优化处理的主要方法:
(1)由于CPU的处理速度远远大于内存的读写速度,为提高整体性能,在硬件上引入硬件高速缓存Cache,就加速对内存的访问。
(2)CPU中指令的执行顺序,如果没有相关性的指令可以乱序执行,这样一便可以充分利用CPU的指令流水线,提高执行速度。
(3)编译器自动对程序进行优化。编译器优化常用的方法有:将内存变量缓存到寄存器,调整指令顺序充分利用CPU指令流水线。
(4)在实际的编程中,程序员可以主动对程序进行编译前优化,提高程序运行效率。

程序优化示例:

int* ptr = A;
for(int i = 0;i< 100;i++)
{
*ptr = i;
}

上面的程序很容易看懂,循环一百次给ptr指向的内容赋值,但是前99次的赋值是毫无意义的,因此编译器会对此进行如下优化

int* ptr = A;
*ptr = 99;
避免了前99次的循环赋值,提高了程序运行速度,大大节省了时间。

volatile关键字解释
(a). 该关键字意思为易变的,因为有些时候某个变量容易被改变,所以我们需要读取当前该变量最新的数据,不需要编译器做优化处理。
(b). 主要用于多线程中。volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现读取数据不一致的现象。

我们用多线程实例详细说明一下读取数据不一致现象(在多线程环境中):

在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;
当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致。
当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。
当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致。

综上所述,总结一下
(1) 一般的程序中,我们尽量避免使用volatile关键字,因为有时候我们需要编译器对我们的程序进行优化处理,以提高程序运行速度,进而提高CPU效率。
(2) 然而在特殊情况中,比如多线程多任务程序中,我们尽量使用volatile关键字,让CPU即时地读取到最新的数据,防止因编译器优化而导致数据不一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值