当前位置: 首页 > news >正文

C++中的volatile关键字

作用:

1.它用于修饰变量,告知编译器该变量的值可能会在程序的外部被改变,编译器不能对这个变量的访问进行优化。这是因为编译器通常会对代码进行优化,例如把变量的值缓存到寄存器中,但对于 volatile 变量,每次访问都要从内存中读取,以确保获取到最新的值。同时, volatile 还能防止编译器对涉及该变量的操作进行指令重排序。

#include <iostream>
#include <thread>
#include <chrono>
// 共享的volatile变量
volatile bool flag = false;
void waitForFlag() {
while (!flag) {
// 这里每次都会从内存读取flag的值,因为它是volatile的
}
std::cout << "Flag is set to true." << std::endl;
}
int main() {
std::thread t(waitForFlag);
std::this_thread::sleep_for(std::chrono::seconds(2));
flag = true;
t.join();
return 0;
}

在这个例子中, flag 变量被声明为 volatile 。子线程中的 while 循环会一直检查 flag 的值,直到它变为 true 。因为 flag 是 volatile ,编译器不会对 while 循环中 flag 的读取进行优化,会确保每次都从内存读取最新的值,这在多线程或硬件交互的场景下很重要。

2.volatile 可以用来防止编译器对指令进行重排序。在多线程或者中断处理的程序环境中,这种重排序可能会导致程序逻辑错误。 volatile 能够保证操作的顺序按照代码中的顺序执行,从而保证程序的正确性。

volatile 关键字与 const 关键字的区别:

1.const 关键字: 

const 修饰的变量是常量,在定义后不能被修改。它主要用于告诉编译器这个变量的值是固定的,编译器可以利用这一点进行一些优化,例如将变量的值替换到使用它的地方,而不用每次从内存读取。

2.volatile 关键字:

 volatile 修饰的变量是可变的,不过它强调变量的值可能会被程序外部(如硬件设备、其他线程或中断服务程序)改变。编译器不会对 volatile 变量进行优化,每次访问该变量时都会从内存中读取最新的值,并且不会对涉及该变量的操作进行指令重排序。

#include <iostream>
// const示例
void constExample() {
const int a = 10;
// a = 20;  // 这行代码会出错,因为不能修改const变量的值
std::cout << "The value of const variable a: " << a << std::endl;
}
// volatile示例
#include <thread>
#include <chrono>
volatile bool flag = false;
void volatileExample() {
std::thread t1( {
// 等待flag变为true
while (!flag) {
// 因为flag是volatile,每次循环都会从内存读取其最新值
}
std::cout << "Flag is now true." << std::endl;
});
// 主线程等待一段时间后将flag设为true
std::this_thread::sleep_for(std::chrono::seconds(2));
flag = true;
t1.join();
}
int main() {
constExample();
volatileExample();
return 0;
}

在这个示例中, constExample 函数展示了 const 变量不能被修改的特性。 volatileExample 函数通过一个简单的多线程场景展示了 volatile 变量的作用,线程 t1 会一直检查 volatile 变量 flag 的值,直到它被主线程修改为 true 。每次检查时,都会从内存读取 flag 的最新值。

相关文章:

C++中的volatile关键字

作用&#xff1a; 1.它用于修饰变量&#xff0c;告知编译器该变量的值可能会在程序的外部被改变&#xff0c;编译器不能对这个变量的访问进行优化。这是因为编译器通常会对代码进行优化&#xff0c;例如把变量的值缓存到寄存器中&#xff0c;但对于 volatile 变量&#xff0c;…...

linux桌面qt应用程序UI自动化实现之dogtail

1. 前言 Dogtail适用于Linux 系统上进行 GUI 自动化测试,利用 Accessibility 技术与桌面程序通信;Dogtail 包含一个名为 sniff 的组件,这是一个嗅探器,用于 GUI 程序追踪; 源码下载:​​dogtail PyPI 可通过sudo python setup.py install安装或sudo pip install dogt…...

Hello World C#

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System; 引入了System命名空间&#xff0c;基本输入输出。一般只用这个&#xff0c;后面的不用 using System.Collections.Generic; 包含了定…...

SAP开发语言ABAP开发入门

1. 了解ABAP开发环境和基础知识 - ABAP简介 - ABAP&#xff08;Advanced Business Application Programming&#xff09;是SAP系统中的编程语言&#xff0c;主要用于开发企业级的业务应用程序&#xff0c;如财务、物流、人力资源等模块的定制开发。 - 开发环境搭建 - 首先需…...

应急响应靶机——easy溯源

载入虚拟机&#xff0c;开启虚拟机&#xff1a; &#xff08;账户密码&#xff1a;zgsfsys/zgsfsys&#xff09; 解题程序.exe是额外下载解压得到的&#xff1a; 1. 攻击者内网跳板机IP地址 2. 攻击者服务器地址 3. 存在漏洞的服务(提示:7个字符) 4. 攻击者留下的flag(格式…...

【前端】vscode报错: 无法加载文件 D:\nodejs\node_global\yarn.ps1,因为在此系统上禁止运行脚本。

vscode运行前端代码时候&#xff0c;执行yarn install时候报错 问题&#xff1a; 无法加载文件 D:\nodejs\node_global\yarn.ps1&#xff0c;因为在此系统上禁止运行脚本。 解决方式&#xff1a; 首先用管理员身份运行vscode 查看 get-ExecutionPolicy&#xff0c;Restrict…...

Spring Web MVC(详解中)

文章目录 Spring MVC&#xff08;中&#xff09;RESTFul风格设计RESTFul风格概述RESTFul风格特点RESTFul风格设计规范RESTFul风格好处RESTFul风格实战需求分析RESTFul风格接口设计后台接口实现 基于RESTFul风格练习&#xff08;前后端分离模式&#xff09;案例功能和接口分析功…...

Flutter:encrypt插件 AES加密处理

1、pubspec.yaml导入插件 cupertino_icons: ^1.0.8 # 密码加密 encrypt: 5.0.3encrypt封装 import package:encrypt/encrypt.dart; /// 加密类 class EncryptUtil {static final EncryptUtil _instance EncryptUtil._internal();factory EncryptUtil() > _instance;Encrypt…...

Python bytes类型及用法

在Python中&#xff0c;bytes类型是一种不可变的字节序列&#xff0c;用于存储原始的二进制数据。bytes对象通常用于处理文件、网络通信和其他需要处理原始字节数据的场景。 以下是bytes类型的一些基本用法和特性&#xff1a; 1. 创建bytes对象 可以通过多种方式创建bytes对…...

阅读《基于蒙特卡洛法的破片打击无人机易损性分析》_笔记

目录 基本信息 1 引言 1.1 主要研究内容 1.2 研究必要性&#xff08;为什么要研究&#xff09; 1.3 该领域研究现状&#xff08;别人做了什么/怎么做的&#xff09; 2 主要研究过程&#xff08;我们做了什么&#xff09; 2.1 建立目标仿真模型 2.2 确定毁伤依据 2.3 无…...

【vim】vim怎么把某一列内容复制到另一列

1. vim 怎么把某一列内容复制到另一列 移动光标到你想复制的列的第一个字符上。按下 ctrlv 进入选择模式。按下方向键选择多行。按下 h 或 j 或 k 或 l&#xff0c;选择整列。按下 y 复制所选择的列。移动光标到你想粘贴内容的列的第一个字符上。按下 p 粘贴内容。...

IP划分(笔记)

IPv4 32位4字节 IPv6 128位16字节 IPv4转IPv6 前10字节全0,2字节全1&#xff0c;再加ipv4的4个字节 IPv4划分笔记&#xff08;有类域&#xff09;&#xff1a; A类&#xff1a;首字节必为0b0xxxxxxx 0.0.0.0/8-127.255.255.255/8 实际范围&#xff1a;1.0.0.1/8-126.25…...

【ChatGPT大模型开发调用】如何获得 OpenAl API Key?

如何获取 OpenAI API Key 获取 OpenAI API Key 主要有以下三种途径&#xff1a; OpenAI 官方平台 (推荐): 开发者用户可以直接在 OpenAI 官方网站 (platform.openai.com) 注册并申请 API Key。 通常&#xff0c;您可以在账户设置或开发者平台的相关页面找到申请入口。 Azure…...

人证合一开启安全认证新时代、C#人证合一接口集成、人脸识别

在数字化转型加速推进的今天&#xff0c;确保用户身份的真实性和唯一性成为了各行各业关注的重点。从金融交易到在线教育&#xff0c;从远程办公到智慧医疗&#xff0c;如何高效准确地验证“你是你”变得至关重要。正是在这种背景下&#xff0c;翔云“人证合一”接口应运而生&a…...

EBS 中 Oracle Payables (AP) 模块的相关集成

Oracle E-Business Suite (EBS) 中的 Oracle Payables (AP) 模块是一个全面的应付账款管理系统&#xff0c;它不仅提供了丰富的功能来管理与供应商的财务交易&#xff0c;还通过与其他模块的紧密集成&#xff0c;实现了企业内部各个业务流程的无缝衔接。以下是 Oracle Payables…...

Flask项目入门—会话技术Cookie和Session

Session和Cookie都是用于跟踪用户会话的技术、它们可以存储用户信息&#xff0c;以便在用户与网站进行交互时提供个性化的体验。然而&#xff0c;这两者在存储位置、使用方式、安全性等方面存在显著的差异。 工作原理/流程 Cookie 1、用户第一次访问时候服务器生成 Cookie&a…...

通达OA down存在信息泄露漏洞

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

Python中的简单爬虫

文章目录 一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务器和浏览器的通讯流程3. 浏览器访问Web服务器的通讯流程4. 加载图片资源代码 二. 基于Web请求的FastAPI通用配置1. 目前Web服务器存在问题2. 基于Web请求的FastAPI通用配置 三. Python爬虫介绍1. 什…...

Scala入门基础(20)数据集复习拓展

一.Stack栈二.Queue 队列 一.Stack栈 Stack:栈&#xff0c;特殊的结构。它对元素的操作是在头部&#xff1a;栈顶 先进后出的队列。pop表示取出&#xff0c;push表示在栈中添加元素 二.Queue 队列 Queue 队列;先进先出.enqueue入队&#xff0c;dequeue出队。...

leetcode 二叉树的最大深度

104. 二叉树的最大深度 已解答 简单 相关标签 相关企业 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...