zoukankan      html  css  js  c++  java
  • 关于c++中的volatile

    1.一般用于修饰指针,该指针指向内容“易变”的内存;用volatile的话,是为了告诉编译器不要去做编译优化,在使用这个存储块的时候必须每次都从指向的内存处拿东西;

    例子:循环多次从一个指针中取内容,编译器觉得既然多次重复的取一个指针的内容,那干脆就把指针的内容放在寄存器里(寄存器是CPU的一个组分),这样可以快速的拿到想要的数据;但是,指针指的内存里边的内容可能会发生变化(内容发生变化,不是指针指向发生变化),你为了每次都拿到最新鲜的指针内容,需要保证每次都去内存(而非寄存器)中重新取,这个时候就需要volatile【易变的; 无定性的】;

    2 volatile类型的变量读取直接从内存读,不经过寄存器;写入(修改)也直接写入内存,通知(编译器),我这个用volatile修饰的变量,无论读写,都是直接操作内存的,任何寄存器中对该变量的保存都是无效的,无用的;但是,这个修饰符不能替代互斥锁,因为它不能保证操作的原子性。就是说同一把锁,在不同位置锁住共享变量进行操作的时候,可以保证锁的范围内,是原子性的操作,运行途中不被打断【这个打断指的是其他线程操作共享变量,指的是有共享资源的地方的打断】,但是volatile不能保证变量的操作是原子性的,就可能出现变量的值异常;---所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束;

    譬如网上都在说的自增,读取变量到累加寄存区,然后把值再写回到内存;一个i++,需要三步->读,改,写回;其中的“改”不是直接在内存中操作volatile变量的,这就会造成不同线程并发操作后数值异常;
    
    i++:{mov,//从内存移动到寄存器
    
    add ,//从给变量做加1操作(寄存器中的变量不是最终的有效值,不同线程可以在寄存器中对该变量的备份进行多次加法)
    
    mov //寄存器的值写回内存}
    
    然后,如果多个线程都在对volatile str =0;做 str++,那结果就不会准,会出现最终的累加结果,不等于累加次数的
    

    3存储

    寄存器(register)(转自https://blog.csdn.net/qq_31813549/article/details/89928157)

    寄存器是距离CPU最近、访问数据速度最快的存储介质,用来做一些最基本的指令和地址存储。寄存器从内存中获取数据,然后在CPU中进行处理,处理完后又将数据暂时存放在寄存器中,再从寄存器传输到内存中。寄存器不需要很大容量,但是必须有匹配CPU的数据传输速度,所以它被集成在了CPU内部以节省数据传输的时间,是CPU的一部分。寄存器具有高性能、高耗电的特点,所以造价成本较高。

    缓存(cache)

    缓存是CPU和内部存储设备之间的桥梁

    如果你的程序要获取的数据刚好在寄存器中,则你可以直接获得该数据。如果在内存中,则需50-200个周期。可见速度差别非常大。如果每次寄存器都从内存中去读取数据,则耗费时间将会相当多。为了弥补这一速度差异,工程师们设计了“缓存”这一工作方式。CPU频繁访问的数据被存储在了缓存中。CPU要获取数据时,首先访问缓存,如果命中则得到数据,如果没有命中则再去访问内存。至于缓存怎么判断哪些数据是会被频繁访问的,这就涉及到相关的算法问题了。

    内存(DRAM)

    内存是CPU和外部存储设备之间的桥梁,用来存放那些将要被CPU处理的数据,以及与外部设备交换数据,分为ROM和RAM(只读存储器,随机存储器)

    固态硬盘(solid state disk)

    固态硬盘是通过固态的电子存储芯片阵列制成的硬盘,包括主控芯片,闪存颗粒,缓存颗粒

    主控芯片:合理调配数据在各个闪存芯片上的负荷,承担闪存芯片和外部SATA接口之间的数据中转,主控芯片直接决定了数据处理的速率和芯片的使用寿命

    闪存颗粒:主要的数据存储单元. 断电后数据可保存下来. 是一种外部存储器, 多用于照相机,音乐播放器,手机SD卡等. 闪存可以划分为:

    SLC(单层式存储),单层电子结构,写入数据时电压变化区间小,寿命长,读写次数在10万次以上,造价高,多用于企业级高端产品。
    MLC(多层式存储),使用高低电压的而不同构建的双层电子结构,寿命长,造价可接受,多用民用高端产品,读写次数在5000左右。
    TLC(三层式存储),是MLC闪存延伸,TLC达到3bit/cell。存储密度最高,容量是MLC的1.5倍。 造价成本最低, 使命寿命低,读写次数在1000~2000左右,是当下主流厂商首选闪存颗粒。
    缓存颗粒:内存和SSD之间数据交换的数据速率的缓冲

    机械硬盘

    机械硬盘是通过磁头和磁盘等机械设备构建的存储设备;是长期联机存储数据的主要介质。为了能够访问数据,系统必须将数据从磁盘移到内存。完成处理后,数据要写回磁盘。

  • 相关阅读:
    Java中使用Log4j记录错误、输出日志
    oracle 触发器的实例(转)
    [jsp学习笔记]servelt get post
    [winfrom]C#中使用SendMessage
    3)创建,测试,发布 第一个NET CORE程序
    DDL和DML 的区别
    [jsp学习笔记] jsp过滤器
    [jsp学习笔记] jsp基础知识 数据初始化、同步
    [jsp学习笔记]jstl标签的使用
    LiteORM-For-DotNet,我的第一个开源库……更新
  • 原文地址:https://www.cnblogs.com/8335IT/p/15076104.html
Copyright © 2011-2022 走看看