关键字:volatile

1.铺垫

1.1volatile是一个非常冷门的关键字,我们在学习C语言的时候,基本不会用到他;如果想用C语言做更多的项目和代码;必须会使用他;

2.volatile

volatile:易变的,不稳定的;

先举例:

内存中,有一个变量 int flag=1;在执行代码时,CPU先将变量读取到寄存器中;然后进行运算(算数运算和逻辑运算);

CPU不断地进行while语句逻辑判断,正常的程序是:CPU将数据从内存(栈或其他)中拿到寄存器处,进行逻辑判断(while判断),判断后,重新将f数据放回内存;第二次运行执行逻辑判断(while()判断),依旧如此进行;

因为while语句中,并没有对flag进行修改,当在编译时,编译器可能自动优化代码,CPU在执行while判断时,不会再从对应的内存中读取数据,而是把这个flag数据直接拿到对应的寄存器中,不断的进行CPU检测;直接检测寄存器的值就可以了;——相对应的是,内存的变量永远不会被读取了,而是就近似的读取离cpu最近的寄存器(此情况是一种内存被覆盖的情况,cpu不再向内存中读取数据,而是向寄存器中读取数据);

此程序在一个执行流下没有问题;可是如果是在多线程的情况下,并发访问flag;另一个线程将flag(flag=0)设置成零,来控制这个线程的运行,而CPU因为编译器的优化,永远都是向寄存器中读取数据;所以cpu读到的条件永远为真,内存中的数据已经置零;会造成很多问题;

矫正:上面所说的是,是为了理解,cpu在读数据时,直接从寄存器中读取;实际上,编译器在做优化的时候甚至不需要从寄存器中读数据了,这个死循环,直接从代码层面上甚至都不读取数据,直接将代码在汇编层面上,设置成自己跳转自己,根本就不读取数据了(这个不读取数据和内存覆盖是等价的);因为此while语句里没有执行代码,使用gcc优化完成后,只判断一次,往后直接成死循环了,连判断都不判断了;

int flag=1;

while(flag){        //CPU要不断进行逻辑判断逻辑运算;

}

 解决:这个关键字volatile是不需要编译器优化,达到稳定访问内存的目的;

volatile int pass=1;        //在定义pass的时候就加上volatile就行;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值