c语言输出王字图形,专一的王子,C语言volatile关键字解析

本文探讨了编译器如何在单线程代码中进行优化,同时强调了在多线程环境下使用volatile关键字确保数据一致性的必要性。通过生日礼物比喻,解释了volatile如何防止数据不一致的问题,涉及内存管理和并发编程的知识。
摘要由CSDN通过智能技术生成

你明天 有一个朋友要过生日,今天把要送的礼物打包好了,一般情况下,我们明天起来不需要再次打开验证一下里面的礼物是否存在,因为我们知道,只要礼物的外包装没有动过,里面的东西应该也没有动过。其实编译器和人一样聪明,为了提高效率也会玩省事,做优化。

如下面的例子:

135311508_1_20180608064149566

编译器扫描了代码发现上面,第一行代码将10赋给了整型变量a,之后a变量的值没有再发生变化,在后面的第二行中,将a变量的值取出来赋给b,在第三行代码里面将a变量的值赋给了c的时候,因为CPU访问内存速度慢,编译器为了提高效率,玩“省事”,直接将10赋给了c。

单从上面的代码我们来看是没有问题的,就如同从外包装看生日礼物完好一样。但是,如果上述代码运行在多线程中,在一个线程上下文中没有改变它的值,但是我们却不能保证变量的值没有被其他线程所改变,就好比是,生日礼物放在其他人那里保管,我们不敢100%的确定它里面的东西完好。当然这种数据不一致的机制不仅仅出现在多线程中,同样在设备的状态寄存器里也会存在。例如,网卡里的某状态寄存器里的值是否为1表示是否有网络数据到达,在当前时刻其值为1,不能代表下一时刻它的值还是1,它的值有外界决定,编译器肯定不能在这种情况下玩“省事”,为了防止在类似的情况下编译器玩省事,可以将这些变量声明为volatile,这样不管它的值有没有变化,每次对其值进行访问的时候,都会从内存里,寄存器了读取,保证数据的一致、做到表里如一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值