栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

volatile

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

volatile

操作系统获取数据和执行程序的原理

从磁盘读取文件程序存入内存,再从内存获取数据放入CPU的寄存器,让CPU从CPU的这个寄存器中获取数据进行修改或者其他操作。

变量的使用过程:

CPU从内存获取这个变量放入CPU的寄存器中,当需要这个变量时,直接从寄存器中获取变量的值,而不需要再从内存获取,再对这个变量进行操作,相加,修改等,如果修改,修改之后把这个修改的变量值存入变量的内存地址。

这种直接从寄存器获取数据的优化方式会出现的问题:

可能其他线程已经修改了这个变量的值,导致这个变量所在内存的值已经修改。因为没有从内存获取,之后的操作可能是错误的。

普通变量的读和写过程:

读:如果CPU寄存器有,就直接从寄存器读取。

写:将值暂时写入寄存器,不写入内存。

volatile的作用就是告诉编译器,对这个变量的操作,每一次都要直接从内存获取变量进行操作。

读:每一次都要从内存读取。

写:每一次都要直接写入内存。

volatile写有两个作用

被volatile关键字修饰的变量修改时会立即写入主内存
被volatile关键字修饰的变量修改时,其余线程存放的该变量的副本会被置为无效,让其他线程不能操作这个变量的副本,必须从内存中获取
 

volatile的可见性

保证共享变量的可见性:保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了这个变量的值,因为新值被立即写入内存,所以这新值对其他线程来说是立即可见的。
 

指令重排


计算机在执行程序时,为了提高性能,编译器和处理器的常常会对指令做重排,一般分以下3种:
编译器优化的重排
指令并行的重排
内存系统的重排

指令重排对单线程没有影响

对多线程的影响:

volatile防止指令重排

volatile关键字通过CPU的内存屏障指令实现禁止指令重排。

实现原理:

多线程共享变量

如果是单线程处理同一个变量,不需要volatile,但是如果多线程共享同一个变量就需要volatile修饰

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/979850.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号