C语言关键字之 volatile

2023-11-09

  本文记录了C语言中 Volatile 关键字的作用。

变量使用 volatile 修饰

  • 告诉编译器,该变量随时会发生变化,每次使用该变量直接到内存中去读取,而不是使用暂存在寄存器中的值
  • 因为当程序中多次读取同一个变量中的值时,编译器会将该变量进行优化,将该变量暂存到寄存器或缓存中供程序使用,而这时如果我们访问该变量的值时,程序就会取寄存器或暂存里的值,而不是内存中的值。这个缓存中的值和内存中的值不一致
  • 当使用 volatile 修饰时,会告诉编译器,不能把该变量优化存储到缓存里面,当程序访问该变量时,都会去内存中读取该变量,这样取出的值才是实际的值。
  • 遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:int volatile vInt; 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。
  1. 会阻止编译器对可变对象的优化,而这些优化是编译器无法预知的
  2. volatile 修饰,系统总是会从主存里读取值,而不是从临时缓存里读取

volatile 使用场景

其实不只是内嵌汇编操纵栈"这种方式属于编译无法识别的变量改变,另外更多的可能是多线程并发访问共享变量时,一个线程改变了变量的值,怎样让改变后的值对其它线程 visible。一般说来,volatile用在如下的几个地方:

  1. 中断服务程序中修改的供其它程序检测的变量需要加 volatile;
  2. 多任务环境下各任务间共享的标志应该加 volatile;
  3. 存储器映射的硬件寄存器通常也要加 volatile 说明,因为每次对它的读写都可能由不同意义;

多线程下的volatile

  当两个线程都要用到某一个变量且该变量的值会被改变时,应该用 volatile 声明,该关键字的作用是防止优化编译器把变量从内存装入 CPU 寄存器中。如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误执行。volatile 的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值。

参考:
https://www.runoob.com/w3cnote/c-volatile-keyword.html

https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777432.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言关键字之 volatile 的相关文章

  • BMS开发之面向对象思想(adbms1818)

    借鉴adbms1818的底层驱动代码 前言 adbms1818的主要用途就是不同种类的寄存器里面存储不同的数据 程序员需要通过特定的协议往寄存器里面写入或者读出数据 1 定义一个结构体 里面存储了adbms1818的所有寄存器的信息 然后我
  • C语言——!(--x)和!(-x)以及while(!(--x)) 和 while(!(-x))

    一 x 和 x 1 x 这个表达式表示先对变量 x 执行自减操作 即 x 的值减去 1 然后对自减后得到的结果取逻辑非 如果自减后的 x 等于 0 则逻辑非运算的结果为真 值为 1 否则结果为假 值为 0 2 x 这个表达式表示对 x 取反
  • 在 Java 中使用 volatile 关键字的完整示例?

    我需要一个简单的使用示例volatileJava 中的关键字 由于不使用而导致行为不一致volatile 理论部分volatile用法对我来说已经很清楚了 首先 没有保证由于非易失性变量而暴露缓存的方式 您的 JVM 可能一直对您非常友善
  • 【C语言】数组

    一维数组的创建和初始化 数组是一组相同类型元素的集合 数组的创建 数组的创建方式 type t arr name const n type t 是指数组的元素类型 const n 是一个常量表达式 用来指定数组的大小 数组创建的实例 数组创
  • CCF模拟题 202309-2 坐标变换(其二)

    问题描述 试题编号 202309 2 试题名称 坐标变换 其二 时间限制 1 0s 内存限制 512 0MB 问题描述 对于平面直角坐标系上的坐标 x y 小 P 定义了如下两种操作 1 拉伸 k 倍 横坐标 x 变为 kx 纵坐标 y 变
  • /lib64/libstdc++.so.6库缺失

    问题 lib64 libstdc so 6 version CXXABI 1 3 8 not found lib64 libstdc so 6 version CXXABI 1 3 9 not found lib64 libstdc so
  • 指针声明为常量和易失性

    在阅读时 我遇到了这种类型的声明和以下行 const volatile char p const volatile char 0x30 p 的值仅受外部条件的影响 我不明白外部条件是什么 还有这种类型的实际用途是什么宣言 The const
  • C和指针课后答案

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 第八章课后答案 提示 以下是本篇文章正文内容 下面案例可供参考
  • c语言学生管理系统

    创建结构体里面包含学生的各种信息 struct xs int xh char xm 20 int gs yy wl double pj struct xs next 创建菜单 void menu printf n n printf 学生管理
  • 我可以使变量暂时不稳定吗?

    In PSoC http www cypress com psoc4 source CY ENG HEADER 可以在内存空间中声明变量 由于闪存读取速度比 RAM 读取速度慢 因此程序将受益于编译器优化 允许将值存储在寄存器中或以其他方式
  • “快速路径”无竞争同步是什么意思?

    来自性能和可扩展性的章节JCIP书籍 http jcip net s3 website us east 1 amazonaws com 同步机制针对无竞争的情况进行了优化 case 易失性始终是无争议的 在撰写本文时 快速路径 无竞争同步范
  • 长赋值和双赋值不是原子的 - 这有什么关系?

    我们知道 long 和 double 赋值在 Java 中不是原子的 除非它们被声明为 volatile 我的问题是它在我们的编程实践中到底有多重要 例如 如果您看到下面的类 其对象在多个线程之间共享 The below class is
  • .NET 多线程、易失性和内存模型

    假设我们有以下代码 class Program static volatile bool flag1 static volatile bool flag2 static volatile int val static void Main s
  • 优先选择同步而不是易失性

    我读过这个answer https stackoverflow com a 3488771 2786156最后写下以下内容 任何你能用 易失性 实现的事情都可以用同步完成 但是 反之则不然 目前还不清楚 JLS 8 3 1 4 https
  • 为什么 POSIX mmap 不返回 volatile void*?

    mmap 返回 void 但不是volatile void 如果我使用 mmap 来映射共享内存 那么另一个进程可能正在写入该内存 这意味着从同一内存位置进行的两次后续读取可能会产生不同的值 这正是 volatile 所针对的情况 那么为什
  • 如果变量在线程之间共享,将变量标记为易失性是否有用? [复制]

    这个问题在这里已经有答案了 Notice 显然我没能向这里的每个人清楚地表达我的观点 这令人难以置信的沮丧 我的目标是消除这样的神话volatile实际上是一个空操作 它什么也不做 我并不是想声明它应该被使用 它是必要的 它不是多余的等等
  • C# 中的 'volatile' 关键字仍然被破坏吗?

    乔 阿尔巴哈里有一个很棒的系列 http www albahari com threading 关于多线程 这是必读的内容 对于任何从事 C 多线程处理的人来说都应该牢记于心 然而 在第 4 部分中 他提到了 volatile 的问题 请注
  • 对 Volatile.Read/Write 的理解

    我试图理解 C Volatile 类 正如我读到的 The Volatile Write方法强制写入位置中的值 到呼叫点 此外 任何较早的程序订单 加载和存储必须在调用 Volatile Write 之前发生 The Volatile Re
  • 涉及优化器的局部变量构造和销毁

    如果我有这个代码 class A class B void dummy A a B b 我知道变量a and b将以相反的分配顺序销毁 b将首先被摧毁 然后a 但我可以确定优化器永远不会交换的分配和构造a and b 或者我必须使用vola
  • 非易失性领域的出版与阅读

    public class Factory private Singleton instance public Singleton getInstance Singleton res instance if res null synchron

随机推荐

  • Docker运行gin项目(go mod)

    准备 先在本地把golang的docker镜像拉取下来 docker pull golang Dockerfile文件内容 在gin项目根目录下创建Dockerfile配置文件 指定基础镜像 FROM golang 维护人信息 MAINTA
  • 【TCN回归预测】基于TCN时间卷积神经网络实现数据多输入回归预测附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 信号处理 图像
  • strapi的使用(三)-- 上传图片

    1 建表添加媒体字段 2 前端请求格式 用axios举例 需要注意几点 第一 传文件时 参数前要加前缀files 比如我表里面的媒体文件字段名为img 前端需要传的参数就为files img 第二 传除文件外的其他参数时 需要其他参数包裹在
  • 运用遍历判断无向图(网)是否连通

    基本思路 使用广度优先遍历方法 任选一个结点开始遍历 遍历结束后每个结点都访问到了即为连通 主代码 判断是否连通的isConnected 方法在最末尾 import dataStructure linearList LinkQueue pu
  • Win11安装适用于 Linux 的 Windows 子系统 (WSL)

    一 什么是适用于 Linux 的 Windows 子系统 官方解释 适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU Linux 环境 包括大多数命令行工具 实用工具和应用程序 且不会产生传统虚拟机或双启动设置开
  • 疫情当下,我们如何正确的看待nft数字藏品

    我是一个做传统家居行业的老板 从2019年底开始 国内疫情的反复蔓延 导致家居生意越来越难 线上线下都很难活下去 公司从一开始的裁员 到最后的关门 中间经历了很多挫折 还记得公司在关门的那一刻 手底下员工对我讲期待我东山再起的那一刻 当时数
  • 蓝桥杯2021年第十二届真题第一场-时间显示

    题目 题目链接 题解 就是考查取模运算 我是FW 居然用了牛刀 我是FW啊 而且我居然以为一秒等于一百毫秒 因为时 分 秒 毫秒之间的换算关系是不随着年月日的不同而变化的 所以直接整除就可以了 可以理解为时分之间为60进制进位关系 分秒之间
  • 未启用windows无线服务器,win10未启用对服务器的远程

    win10未启用对服务器的远程 内容精选 换一换 Windows Server 2012 R2操作系统弹性云服务器 本地使用远程桌面连接功能连接云服务器并启用redirected drive功能时 云服务器出现蓝屏 远程桌面连接启用了red
  • Android多线程下载断点续传

    先上图看卡结果 GITHUB Android多线程下载断点续传 下载杵这儿 如图所示点击下载就开始下载 点击停止就会停止再次点击下载就会接着下载了 设计思路是这样的 首先通过广播将下载信息传递给DownService DownService
  • 关于OAM技术的知识总结

    OAM技术 1 OAM技术产生的背景 以太网最初是为局域网设计的 由于局域网本身已具备较高的可靠性和稳定性 因此在设计以太网之初并未建立管理 维护的机制 而随着以太网在局域网 城域网以及广域网上的广泛应用 以太网管理维护机制的缺乏的缺点被放
  • Vue3通透教程【七】生命周期函数

    文章目录 写在前面 生命周期钩子函数 组合式API生命周期 写在最后 写在前面 专栏介绍 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章 应粉丝要求开始更新 Vue3 的相关技术文章 Vue 框架目前的地位大家应该都晓得 所谓三大
  • 卸载 kubesphere

    文章目录 脚本卸载 kk 卸载 脚本卸载 官方文档 从 Kubernetes 上卸载 KubeSphere 获取卸载脚本 卸载脚本 usr bin env bash function delete sure cat lt lt eof ec
  • jupyter notebook目录安装

    目录不是jupyter notebook自带的 需要手动安装 具体安装过程如下 step1 在Windows搜索框输入Anaconda Prompt 打开它 step2 输入pip install jupyter contrib nbext
  • avalon实现if-else

    div div class text1 if 的内容 div div
  • Communications link failure mysql在应用启动后偶发连接断开修复

    最近应用在启动一段时间一后 就会偶发Communications link failure错误 偶尔也会报connect refused 在网上找了一圈 找到比较靠谱的说法 mysql的server端 有自动断连机制 如果一个连接超过tim
  • centos7完全卸载并重装yum和python2.7

    前言 工作中有需要用到gitlab ci cd 需要在服务器上安装 nodejs 结果因为python版本过低问题安装不了 然后在搞python升级到3版本 结果越搞越头大 环境全都搞乱了 一气之下把python全删了 结果发现yum有依赖
  • 引用账户锁定无法登录_win10登陆失败提示引用的帐户已被锁定无法登录怎么办?...

    win10系统出现了一个问题 登录失败提示 引用的帐户当前已被锁定 可能无法登录到 这是因为一直在登录界面输入错误的密码超过五次 就会被锁定导致的 该怎么解决这个问题呢 下面我们就来看看这个问题的多种解决办法 一 问题描述 1 引用的帐户目
  • HTML+CSS+JavaScript入门教程(万字)

    前言 作为一名后端开发人员 开发过程中 必不可少的与前端进行对接 因此尽管是后端开发者 也需要一定的前端知识 因此写下HTML CSS JavaScript入门知识 着重介绍了JavaScript 方便自己复习 也各位小伙伴参考 一 HTM
  • 如何营造办公室的友好氛围

    办公室有时就是一个小社会 人多嘴杂 面对各种利益冲突 你必须找准角色定位 既不能孤芳自赏 又不能表现过度 如何迅速赢得大多数人的好感 尽快融入其中 营造良好的人际关系呢 办公室5大忌 1 切忌拉小圈子 互散小道消息 办公室内切忌私自拉帮结派
  • C语言关键字之 volatile

    本文记录了C语言中 Volatile 关键字的作用 目录 变量使用 volatile 修饰 volatile 使用场景 多线程下的volatile 变量使用 volatile 修饰 告诉编译器 该变量随时会发生变化 每次使用该变量直接到内存