C/C++面试题(二):std::atomic与volatile
yuyutoo 2025-05-02 22:16 20 浏览 0 评论
volatile 是 C/C++ 中的一个关键字,用于告知编译器某个变量的值可能会在程序的控制之外被意外修改(例如被硬件、中断服务程序、多线程环境或其他外部代理)。为了防止编译器对代码进行某些可能破坏程序正确性的优化,开发者需要使用 volatile 来强制编译器在每次访问该变量时都直接从内存中读取或写入,而不是依赖寄存器中的缓存值或优化掉“看似冗余”的访问。
std::atomic 是 C++11 引入的一个模板类,用于在多线程环境中实现原子操作。它确保对共享变量的操作是线程安全的,并且可以控制内存顺序(memory order)。
volatile
- 禁用编译器优化:
- 编译器通常会对变量访问进行优化,例如将变量缓存到寄存器中以提高访问速度。
- volatile 会强制编译器每次访问变量时都从内存中读取或写入,确保获取最新值。
- 典型应用场景:
- 硬件寄存器:嵌入式系统中,硬件状态可能通过内存映射的寄存器被外部修改。
// 假设 0x4000 是某个硬件寄存器的内存映射地址
volatile uint32_t* const hardware_reg = reinterpret_cast<volatile uint32_t*>(0x4000);
void read_hardware() {
// 每次读取都会直接从硬件寄存器获取最新值
uint32_t value = *hardware_reg;
}
- 中断服务程序(ISR):中断可能修改共享变量。
volatile bool data_ready = false; // 中断可能修改此变量
void ISR() {
data_ready = true; // 中断触发时修改
}
int main() {
while (!data_ready) { // 每次循环都从内存读取最新值
// 等待数据准备就绪
}
}
- 多线程共享变量(但需注意,volatile 不能替代线程同步机制,多线程中仍需使用 std::atomic 或互斥锁)。
volatile bool flag = false;
// 线程 A
void thread_a() {
flag = true; // 修改标志
}
// 线程 B
void thread_b() {
while (!flag) { // 读取标志
// 等待
}
}
std::atomic的常用操作
- 加载(Load):
int value = counter.load(std::memory_order_relaxed);
- 存储(Store):
counter.store(42, std::memory_order_relaxed);
- 交换(Exchange):
int old_value = counter.exchange(100);
- 比较并交换(Compare-and-Swap, CAS):
int expected = 10;
bool success = counter.compare_exchange_strong(expected, 20);
- 原子加减:
counter.fetch_add(5); // 原子加 5
counter.fetch_sub(3); // 原子减 3
内存顺序(Memory Order)
std::atomic 支持多种内存顺序,用于控制操作的可见性和顺序性。常用的内存顺序包括:
- std::memory_order_relaxed:只保证原子性,不保证顺序。
- std::memory_order_acquire:保证后续操作不会重排到该操作之前。
- std::memory_order_release:保证前面的操作不会重排到该操作之后。
- std::memory_order_seq_cst:最严格的内存顺序,保证全局顺序一致性。
counter.store(42, std::memory_order_release);
int value = counter.load(std::memory_order_acquire);
std::atomic应用场景
- std::atomic 是 C++ 中实现线程安全操作的首选工具
- 它提供了原子操作和内存顺序控制,适用于多线程环境中的共享变量。
- 与 volatile 不同,std::atomic 不仅保证原子性,还提供了更强的内存顺序保证。
std::atomic与volatile的区别总结
特性 | volatile | std::atomic |
禁用编译器优化 | 是 | 是 |
原子性保证 | 否 | 是 |
内存顺序控制 | 无 | 支持(如 memory_order_relaxed) |
适用场景 | 硬件/中断/信号处理 | 多线程同步 |
相关推荐
- 《保卫萝卜2》安卓版大更新 壕礼助阵世界杯
-
《保卫萝卜2:极地冒险》本周不仅迎来了安卓版本的重大更新,同时将于7月4日本周五,带来“保卫萝卜2”安卓版本世界杯主题活动的火热开启,游戏更新与活动两不误。一定有玩家会问,激萌塔防到底进行了哪些更新?...
- 儿童手工折纸:胡萝卜,和孩子一起边玩边学carrot
-
1、准备两张正方形纸,一橙一绿,对折出折痕。2、橙色沿其中一条对角线如图折两三角形。3、把上面三角折平,如图。4、绿色纸折成三角形。5、再折成更小的三角形。6、再折三分之一如图。7、打开折纸,压平中间...
- 《饥荒》食物代码有哪些(饥荒最新版代码总汇食物篇)
-
饥荒游戏中,玩家们需要获取各种素材与食物,进行生存。玩家们在游戏中,进入游戏后按“~”键调出控制台使用代码,可以直接获得素材。比如胡萝卜的代码是carrot,玉米的代码是corn,南瓜的代码是pump...
- Skyscanner:帮你找到最便宜机票 订票不求人
-
你喜欢旅行吗?在合适的时间、合适的目的地,来一场说走就走的旅行?机票就是关键!Skyscanner这款免费的手机应用,在几秒钟内比较全球600多家航空公司的航班安排、价格和时刻表,帮你节省金钱和时间。...
- 小猪佩奇第二季50(小猪佩奇第二季英文版免费观看)
-
Sleepover过夜Itisnighttime.现在是晚上。...
- 我在民政局工作的那些事儿(二)(我在民政局上班)
-
时间到了1997年的秋天,经过一年多的学习和实践,我在处理结婚和离婚的事情更加的娴熟,也获得了领导的器重,所以我在处理平时的工作时也能得心应手。这一天我正在离婚处和同事闲聊,因为离婚处几天也遇不到人,...
- 夏天来了就你还没瘦?教你不节食13天瘦10斤的哥本哈根减肥法……
-
好看的人都关注江苏气象啦夏天很快就要来了你是否和苏苏一样身上的肉肉还没做好准备?真是一个悲伤的故事……下面这个哥本哈根减肥法苏苏的同事亲测有效不节食不运动不反弹大家快来一起试试看吧~DAY1...
- Pursuing global modernization for peaceful development, mutually beneficial cooperation, prosperity for all
-
AlocalworkeroperatesequipmentintheChina-EgyptTEDASuezEconomicandTradeCooperationZonei...
- Centuries-old tea road regains glory as Belt and Road cooperation deepens
-
FUZHOU/ST.PETERSBURG,Oct.2(Xinhua)--NestledinthepicturesqueWuyiMountainsinsoutheastChi...
- Ftrace function graph简介(flat function)
-
引言由于android开发的需要与systrace的普及,现在大家在进行性能与功耗分析时候,经常会用到systrace跟pefetto.而systrace就是基于内核的eventtracing来实...
- JAVA历史版本(java各版本)
-
JAVA发展1.1996年1月23日JDK1.0Java虚拟机SunClassicVM,Applet,AWT2.1997年2月19日JDK1.1JAR文件格式,JDBC,JavaBea...
- java 进化史1(java的进阶之路)
-
java从1996年1月第一个版本诞生,到2022年3月最新的java18,已经经历了27年,整整18个大的版本。很久之前有人就说java要被淘汰,但是java活到现在依然坚挺,不知道java还能活...
- 学习java第二天(java学完后能做什么)
-
#java知识#...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 《保卫萝卜2》安卓版大更新 壕礼助阵世界杯
- 儿童手工折纸:胡萝卜,和孩子一起边玩边学carrot
- 《饥荒》食物代码有哪些(饥荒最新版代码总汇食物篇)
- Skyscanner:帮你找到最便宜机票 订票不求人
- 小猪佩奇第二季50(小猪佩奇第二季英文版免费观看)
- 我在民政局工作的那些事儿(二)(我在民政局上班)
- 夏天来了就你还没瘦?教你不节食13天瘦10斤的哥本哈根减肥法……
- Pursuing global modernization for peaceful development, mutually beneficial cooperation, prosperity for all
- Centuries-old tea road regains glory as Belt and Road cooperation deepens
- 15 THE NUTCRACKERS OF NUTCRACKER LODGE (CONTINUED)胡桃夹子小屋里的胡桃夹子(续篇)
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)