思科网站建设配置站点dns服务沧州市网站设计

张小明 2026/1/1 7:16:08
思科网站建设配置站点dns服务,沧州市网站设计,大型网站响应式,wordpress 增加中文字体《你真的了解C吗》No.008#xff1a;volatile——编译器优化的止步 导言#xff1a;被误解的“线程安全”救星 在面试中#xff0c;如果问“volatile 关键字有什么用#xff1f;”#xff0c;超过半数的候选人会回答#xff1a;“用于多线程编程#xff0c;保证变量对所…《你真的了解C吗》No.008volatile——编译器优化的止步导言被误解的“线程安全”救星在面试中如果问“volatile关键字有什么用”超过半数的候选人会回答“用于多线程编程保证变量对所有线程可见。”这是一个非常危险的误解。在 C特别是标准 C中volatile完全不涉及线程同步、原子性或内存顺序Memory Ordering。如果你把它当成轻量级的mutex或atomic来用你的程序可能在 x86 上跑得好好的到了 ARM 架构或者在激进优化的编译器下就会彻底崩溃。volatile的真正含义只有一个告诉编译器别自作聪明地优化我必须每次都去内存里读写。一、编译器的“自作聪明”为了理解volatile我们必须先理解编译器的优化策略。编译器通常假设程序是单线程执行的且内存中的值只有在程序显式修改它时才会改变。场景轮询等待假设我们要检测一个外部硬件状态标志// 这里的 flag 可能被硬件中断或者另一个线程修改intflag0;voidwait_for_flag(){while(flag0){// 等待 flag 变为非 0}do_something();}编译器的优化逻辑编译器分析while循环。它发现循环体内没有任何代码修改flag。它认为flag是不变的。为了加速它将flag的值读入 CPU寄存器以后每次只比较寄存器里的值。结果程序变成了一个死循环。即使硬件在内存中把flag改成了 1CPU 依然在比较寄存器里那个旧的 0。二、volatile的三大特性当你把变量声明为volatile int flag 0;时你强制编译器遵守以下规则1. 易变性 (Volatility)编译器必须假设该变量的值随时可能被“不知名的力量”操作系统、硬件、其他线程修改。因此每一次对该变量的读取都必须生成从内存地址加载的指令每一次写入都必须生成写回内存的指令。严禁缓存到寄存器。2. 不可优化性 (Un-optimizability)即使写入的值似乎没用编译器也不能将其优化掉。intx10;x20;// 编译器可能直接优化掉这行只保留 x 30x30;volatileinty10;y20;// 编译器必须生成写入 20 的指令y30;// 编译器必须生成写入 30 的指令这在操作硬件寄存器时非常关键比如先写指令寄存器再写数据寄存器顺序和步骤都不能少。3. 顺序性受限编译器不会重排两个volatile变量之间的操作顺序。但是这是一个巨大的陷阱编译器可以重排volatile变量和非volatile变量之间的顺序。三、致命陷阱volatile不是原子操作这是 C 开发者从 Java 或 C# 转过来时最容易犯的错。在 Java/C# 中volatile确实包含内存屏障和原子性语义但在 C 中没有。案例简单的计数器volatileintcounter0;voidincrease(){counter;// 错误这在多线程下不安全}即使加了volatilecounter依然是三个独立的 CPU 指令Load:从内存读取counter到寄存器。Add:寄存器加 1。Store:把寄存器值写回内存。如果有两个线程同时执行完全可能发生冲突竞态条件。volatile无法解决这个问题你需要的是std::atomic(C11)或操作系统提供的锁。四、volatile的正确应用场景在 C 中volatile实际上主要用于以下三个低层场景1. 内存映射 I/O (MMIO)这是volatile的老本行。当一个内存地址实际上映射到硬件设备的寄存器时必须使用volatile。// 假设 0xFFFF0000 是串口发送寄存器的地址volatileunsignedint*uart_txreinterpret_castvolatileunsignedint*(0xFFFF0000);*uart_tx0xAA;// 写数据硬件发送*uart_tx0xBB;// 再次写数据// 如果没有 volatile编译器可能认为第一次写入是多余的并将其优化掉。2. 信号处理 (Signal Handling)当使用signal函数注册信号处理程序时在处理程序中修改的全局标志位必须是volatile sig_atomic_t类型。volatile的作用确保编译器不会把变量缓存到寄存器保证每次都从内存读写。sig_atomic_t的作用这是 C 标准定义的一种整数类型它保证对该类型的读写操作是原子的Atomic。如果不使用它例如使用普通的int或long在某些 8 位或 16 位 CPU 架构上写入一个 32 位整数可能需要两条指令例如先写高 16 位再写低 16 位。如果信号处理程序恰好在两条指令之间执行读取者可能会读到一半新、一半旧的“撕裂”数据Torn Read/Write。结论只有volatile sig_atomic_t才能同时解决可见性问题和指令撕裂问题。volatilesig_atomic_t g_stop0;voidhandler(int){g_stop1;// 这是一个原子操作且不会被优化}intmain(){signal(SIGINT,handler);while(!g_stop){...}// 必须每次去内存读取 g_stop}3.setjmp和longjmp在使用setjmp进行非局部跳转时setjmp调用之后修改的局部变量如果希望在longjmp回来后保留修改后的值必须声明为volatile。否则编译器可能会将其缓存在寄存器中导致跳转回来后值被回滚。总结它是给机器看的不是给线程看的volatile解决的是编译器优化带来的问题。std::atomic/Mutex解决的是 CPU 乱序执行和多线程并发带来的问题。在 C03 时代由于缺乏标准的原子库开发者确实经常滥用volatile配合特定的编译器扩展如 MSVC 的volatile在某些版本下确实提供了内存屏障来进行多线程编程。但在现代 C 标准下请把volatile留给硬件驱动和信号处理把多线程任务交给std::atomic。下一篇预告变量前面除了const和volatile还有一个最常见的关键字static。但你知道吗static在 C 中竟然有四种完全不同的含义其中一种甚至被标准委员会建议弃用。➡️《你真的了解C吗》No.009static的四个意义 (The Four Faces of Static): 上下文决定论。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

中国工程建设招标网官方网站陕西建筑培训网

我记得有次和一位35岁的老程序员聊过天。他说:“AI能写代码了,我怕我这十年经验,变成废纸了。”你呢?你有没有过类似的焦虑?AI复现核心算法的速度之快,远超很多人想象。这不是灾难预言。这是现实。麦肯锡最…

张小明 2025/12/29 5:28:04 网站建设

青岛即墨城乡建设局网站个人音乐网站程序源码

RAG(检索增强生成)技术通过先检索私有知识库再生成答案的方式,解决了大模型不了解私有数据和产生幻觉的问题。文章详细介绍了RAG的完整流程:文档整理、数据切片、向量化、存储、检索、重排和生成,并通过智能客服实例提…

张小明 2025/12/29 5:28:01 网站建设

外国服务器的网站网站建设网站推广优化

前言 在 Selenium 自动化爬虫开发中,页面元素加载时序问题是导致爬虫失败的核心痛点之一。动态页面的元素加载往往依赖 JavaScript 异步请求,若在元素未完全加载时执行定位、点击等操作,会直接触发NoSuchElementException等异常。隐式等待与…

张小明 2025/12/29 5:27:58 网站建设

企业网站开发综合实训广安建设企业网站

在分布式系统中,事务一致性是绕不开的核心难题。尤其是在“本地业务操作”与“消息发送”需原子性完成的场景(如订单创建成功后必须同步发送库存扣减消息),普通消息极易出现“业务成功但消息未发”“消息已发但业务失败”的不一致…

张小明 2025/12/29 5:27:53 网站建设

成都学习网站建设做网站的公司好坑啊

Rebel终极AppKit优化框架:告别Cocoa开发痛点 【免费下载链接】Rebel Cocoa framework for improving AppKit 项目地址: https://gitcode.com/gh_mirrors/reb/Rebel 在macOS应用开发中,AppKit框架虽然功能强大,但常常伴随着繁琐的API和…

张小明 2025/12/29 5:27:50 网站建设

泰安网站建设公司带友情链接翻译

广域网技术 通过本章内容我们可以了解广域网基本概念、PPP、PPPoE的基本概念和工作原理,以及MPLS/SR的相关概念 广域网技术 一、早期广域网技术概述 早期广域网技术 二、PPP协议原理 2.1 PPP基本概述 2.2 PPP原理描述 PPP帧格式 PPP链路建立流程 2.3 PPP配置 三、PPPoE原理 3…

张小明 2025/12/29 7:27:03 网站建设