Volatile相关知识

volatile详解和相关知识的延伸 我们为什么要使用volatile,因为系统会把我们所写的局部变量,自动放在cpu的寄存器里,有人就很好奇,为什么会自动放进寄存器里呢?因为读取寄存器里的变量比读取内存里的快,因为系统在某些时候,需要频繁的读取变量,如果这个时候每次都去内存里进行存取操作,就会耗费较多的时间,如果我们能够有效地利用CPU的寄存器,就会显著提升程序的运行效率。... 阅读详情

    区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。


volatile的作用

  volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,要求每次直接读值.非常典型的就是寄存器的值可能被人为的从硬件上改变,所以必须要求 要求每次直接读值。
  简单地说就是防止编译器对代码进行优化.比如如下程序:
  XBYTE[2]=0x55;
  XBYTE[2]=0x56;
  XBYTE[2]=0x57;
  XBYTE[2]=0x58;

  如果对外部硬件上述四条语句分别表示不同的操作,会产生四种不同的动作,那么编译器就不能像对待纯粹的程序那样对上述四条语句进行优化只认为XBYTE[2]=0x58,而忽略前三条语句,并且只产生1条机器码。如果XBYTE用volatileo修饰过,此时编译器会逐一的进行编译并产生相应的4条机器码。


再详细解释一下:
  推荐一个定义为volatile的变量是说这变量可能会被意想不到地改变(多个执行流?),这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
  1). 并行设备的硬件寄存器(如:状态寄存器)
  2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)          非局部变量。
  3). 多线程应用中被几个任务共享的变量

面试中可能会提问到volatile的相关知识:
  1). 一个参数既可以是const还可以是volatile吗?解释为什么。
  2). 一个指针可以是volatile 吗?解释为什么。
  3). 下面的函数有什么错误:
   int square(volatile int *ptr)
   {
      return *ptr * *ptr;
   }
  下面是答案:
  1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
  2). 是的。尽管这并不很常见。一个例子是当一个中断服务子程序修改一个指向一个buffer的指针时。 (一个全局的指针,指向一个buffer)
  3). 这段代码是个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
  int square(volatile int *ptr)
  {
      int a,b;
      a = *ptr;
      b = *ptr;
      return a * b;
  }
  由于*ptr的值可能被意想不到地改变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
  long square(volatile int *ptr)
  {
      int a;
      a = *ptr;
      return a * a;
  }

 转自网友的文章,原文链接:

http://www.arm9home.net/read.php?tid-20494.html





Synchronized和Volatile底层知识、内存屏障相关内容 Synchronized HotSpot 的 synchronized // 二进制 字节码相关说明 synchronized(Object o) 锁对象: 表示当线程拿到了一把锁o的时候才可以执行synchronized块或者synchronized方法中的代码逻辑,并不是锁了synchronized包裹的代码。 在一个对象中是通过Object 对象头的 在JDK1.6之前Synchronized只有传统的锁机制,1.6之后对其进行了优化升级(锁升级) 锁升级: jdk1.6之后引入了偏向所和轻量级锁的 阅读详情

相关推荐

STM32F103xx / STM32F429VET6最小系统原理图

心血来潮想试一下STM32F4系列和F1系列在编程上有什么差别,手头没有开发板,本着能勤俭节约的原则自己先做一块看看能不能成,看了一下STM32F429VET6的芯片在F429xx中最便宜,对照着数据手册绘制了原理图画了PCB,目前打板中,焊接完如果跑不通回来修改文章。这里我们可以看到,VDD是标准工作电压,VDDA是模拟工作电压,且VDDA必须与VDD等电位,VBAT是备份工作电压,一般接纽扣电池电源,如果存在VREF+引脚,则要求VDDA-VREF+ < 1.2V。截图下来比较糊,不知道为什么。

m0_51294753的博客 1万+

volatile相关知识

C中的volatile变量是什么? 回答: 的易失性的关键字是类型限定符防止从编译器optimization.According至C标准的对象,具有挥发性限定类型可以以实施方式未知进行修改或具有其他未知侧effects.You也可以说,一个对象可以随时更改volatile限定对象的值,而不需要代码执行任何操作。 如果一个对象被volatile限定符限定,那么每次程序访问它时,编译器都会从内存...

liming0931的专栏 196

ISP模块之色彩增强算法--HSV空间Saturation通道调整

色彩增强不同于彩色图像增强,图像增强的一般处理方式为直方图均衡化等,目的是为了增强图像局部以及整体对比度。而色彩增强的目的是为了使的原有的不饱和的色彩信息变得饱和、丰富起来。对应于Photoshop里面的“色相/饱和度”调节选项里面对饱和度的操作。色彩增强的过程,并不改变原有彩色图像的颜色以及亮度信息。     在我的色彩增强算法模块里面,始终只针对色彩饱和度(Saturation)信息做研究,

松间明月 1万+

Volatile相关知识点

JMM(java memory model)java内存模型 每台计算机中可用于处理或者存储数据的包括:硬盘、物理内存、缓存(多级)、CPU寄存器等。 进程是计算机分配资源的最小单元,线程是CPU调度的最小单元。 计算机为每个进程分配资源,其中就包括了内存资源,用于存储运行时数据的,就好比在物理内存中划分了某个区域,并将这块区域标记为只有该进程才可以访问(读取和写入),不同进程之前不能直接通信传递数据,需要借助特殊的方式来实现通信交互,而这些方式可以有:内存共享、socket、binder(an

Coder蒋的博客 1626

跨模型的 API 调用与集成:使用 Spring AI 构建可移植的 API 代码,支持多个 AI 模型(如 OpenAI、Anthropic 等)的调用

Spring AI 是 Spring 生态系统中的一部分,旨在提供一种简单、可扩展的方式来集成人工智能模型。Spring AI 使得开发者可以使用现有的 Spring 体系结构方便地访问多种 AI 模型和服务,例如 OpenAI、Anthropic、HuggingFace 等。

秋元的博客 2404

Obsidian从零搭建:可验证、可回溯、可演进的知识库工具链

个人知识库不是开箱即用的软件,而是基于Markdown内核构建的可演进系统。其核心原理在于分离‘稳定内核’与‘可插拔扩展’:Obsidian原生支持双链、嵌入、Frontmatter等基础能力,构成不可降级的知识骨架;而Dataview、Templater等插件则作为可验证、可回溯的增强层,需通过三问验证(解决痛点?有原生替代?失效可降级?)方可引入。这种设计赋予知识库技术价值——抗版本升级、跨平台兼容、离线可用,并支撑技术文档管理、项目复盘、读书笔记等真实场景。当面对computer use插件不可用或h

weixin_30660027的博客 680

volatile的相关知识点

- C++中的Volatile主要用于硬件相关的操作,而Java中的Volatile主要用于解决多线程环境下的变量可见性问题。 - C++中的Volatile只能保证单个变量的原子性,而Java中的Volatile可以保证变量的可见性和有序性。 - C++中的Volatile不能保证原子操作,需要使用其他同步机制来实现,而Java中的Volatile可以保证某些简单的原子操作,比如自增、自减等。

好看的皮囊千篇一律,有趣的灵魂万里挑一。 1123

今天出一个candence 17.4 allego的安装教程

7、安装完成,接下来进行补丁更新,找到Hotfix_SPB17.40.035_wint.iso软件 ,右击鼠标选择装载。6、因为之前选择的定制安装,这一步不知道具体要安装啥,因此都勾选,点击NECK,接下来等待安装完成。后面经过仔细对比,发现是前面更新补丁时选择了F盘,F盘是candence安装包,不是补丁。8、在破戒大师里选择安装更新补丁,并找到刚才装载的安装包里的程序,点击下一步。3、打开破戒大师,找到安装candence进行如下图选择,点击下一步。有耐心的人可以重新卸了再装一边,我就不卸了,直接装。

hcvinh的博客 2725

volatile相关知识点总结

volatile的两个作用: 1、保证数据的可见性(底层原理:CPU原语支持,使用缓冲一致性协议) 多线程编程时,每个线程会有自己独立的缓冲(JVM寄存器),对于多个线程共享的数据(堆中变量),不加volatile的情况下,如果Thread1修改了变量的值,不会立刻写回去,这是其他线程读取到的变量值就会和Thread1不一致。 加上volatile关键字以后,如果有一个线程修改了共享变量的值会立刻写回去,同时其他线程独有的变量副本失效。 需要注意的是:volatile只保证可见...

奔跑的蜗牛 242

Lammps不同亲疏水性粗糙表面的润湿行为模拟(包含in文件)

Lammps粗糙表面的润湿行为模拟(包含in文件)前言—润湿行为模拟一、物理模型构建二、具体in文件—in文件内循环亲疏水性三、具体in文件—分子模板构建初始模型以及平衡态模拟四、全部代码(基地粗糙表面只提供data文件) 前言—润湿行为模拟 润湿现象:当液体与固体接触时,液体的附着层将沿固体表面延伸。当接触角 θ\rm \thetaθ 为锐角时,液体润湿固体,若θ为零时,液体将展延到全部固体表面上。润湿现象的产生与液体和固体的性质有关。(来自百度百科) 润湿行为的本质是固液之间的相互作用,也就是分子间的范

Rockyoung 7090

国科大学习资料--高级软件工程-复习题选择题答案

国科大学习资料–高级软件工程(罗铁坚 魏峻 刘丹)-复习题选择题答案 ’‘

无名何许人的博客 1165

volatile相关知识总结

有volatile变量修饰的共享变量进行写操作的手会多出第二行汇编代码,Lock前缀指令在多核处理器下会引发两件事情; 1.强当前处理器缓存行的诗句歇会到系统内存; 2.这个歇会内存的操作会使得在其他CPU里缓存了该内存地址的数据无效; 为了提高处理速度,处理器不直接合内存进行通信,而是先将系统内存的数据读到内部缓存(L1 L2等)后再进行操作,但操作完不知道何时回写到内存 若声明了volatile变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存

搓搓那年时光静好 222

创建 Fiori Space 时看不到传输请求的根因与排查路径

摘要: 在创建Fiori Space时,若Transport字段下拉列表为空,通常是因为系统未找到符合要求的传输请求。主要原因是: 请求类型不匹配:需使用Customizing request而非Workbench request。 用户权限问题:当前用户需在请求下有可用的task。 客户端或系统不一致:请求需在当前客户端和正确系统(如后端)中创建。 解决方法: 在当前客户端和系统中新建Customizing request,确保包含用户task。 检查是否为前后端分离架构,确保请求创建在正确的系统。 验证

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 107

synchronized和volatile相关知识

本文介绍Synchronize和Volatile关键字相关知识 在多线程环境下,线程是交替执行的,多线程竞争共享资源容易产生线程不安全的问题,甚至产生死锁的问题。 使用多线程,一定要保证程序是线程安全的。通常会采用以下一些方法来保证线程安全: 多线程之间没有共享变量,即考虑使用线程私有变量 加锁 CAS Synchronized Synchronized是Java的关键字,它可以将代码块锁起来。 public void synchronized lock(){ //do something .

CarrotZsy的博客 174

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

01.Volatile相关知识

1.Volatile相关知识 Volatile是区分C程序员和嵌入式系统程序员最基本的问题。 嵌入式系统程序员经常同硬件、中断、RTOS等打交道,所有这些都要求volatile变量。不懂volatile很可能会带来灾难。volatile的作用 作为指令关键字, 确保本条指令不会因编译器的优化而省略,要求每次直接读值.非常典型的就是寄存器的值可能被人为的从硬件上改变,所以必须要求每次直接读值。简...

weixin_30376323的博客 111

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

volatile与synchronized 相关知识小结

在Java中,为了保证多线程读写数据时保证数据的一致性,可以采用两种方式:synchronized关键字和volatile关键字   首先介绍synchronized : 同步块,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用synchronized 修饰的方法 或者 代码块。 sync

滚蛋吧,生活。 330

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Volatile相关的一些底层知识

CPU是你机器的心脏,最终由它来执行所有运算和程序。主内存(RAM)是你的数据(包括代码行)存放的地方。CPU和主内存之间有好几层缓存,因为即使直接访问主内存也是非常慢的。如果你正在多次对一块数据做相同的运算,那么在执行运算的时候把它加载到离CPU很近的地方就有意义了(比如一个循环计数-你不想每次循环都跑到主内存去取这个数据来增长它吧)。 越靠近CPU的缓存越快也越小。所以L1缓

零度咖啡 593

volatile 关键字相关知识点、原理及场景详解

1、volatile含义 volatile是一个类型修饰符(type specifier)。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接从主存读值。volatile的本身含义即为易变的、不稳定的,也就是说被它修饰的变量可能会被意想不到地改变。 2、相关知识点 2.1 CPU 缓存 CPU缓存(Cache Memory)位于CPU与内存之间的临时存储器...

qqxhb 资源共享 676

整理volatile相关知识点

前言:volatile关键字在面试中经常被问到,从volatile关键字可以引申出许多知识点,因此有必要对此进行总结。本文根据《深入理解Java虚拟机——JVM高级特性与最佳实践》中的相关章节,整理得来。 相关名词 TPS(Transactions Per Second):每秒事务处理数,衡量一个服务性能好坏的评判标准。 JMM(Java Memory Model):Java内存模型。 ...

weixin_30649641的博客 175

Java面试题——volatile关键字以及相关知识

JMM模型 首先你要有JMM(java memory model)的相关知识 如果没有请看这篇文章:JMM和JVM内存模型 volatile定义 volatile是java虚拟机提供的轻量级的同步机制 三个特性:1. 保证可见性 2.不保证原子性 3.禁止指令重排 保证可见性 验证代码 public class VolatileDemo { boolean running = true;...

清风丨的博客 651

Volatile相关知识点和JMM内存模型

Volatile和JMM内存模型的可见性 谈谈对Volatile的理解 ​ Volatile在单线程开发的用不到的,Volatile是Java虚拟机提供的轻量级的同步机制 Volatile的三大特性 保证可见性 不保证原子性 禁止指令重排 JMM是什么 JMM是java内存模型,英文全称为Java Memory Model,简称JMM,JMM本身是不存在的,是为了我们方便理解抽象化的一种概念,代表的是一组规则和规范,它定义了程序中各个变量的的访问方式 JMM关于同步规定 线程在解锁前,必须把共享变量

Eric_飞 216
上一篇: git 使用(ssh key创建和github使用)
下一篇: gcc编译器各种warning 解决方式
xianjian_x
博客等级 码龄14年 231粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值