news 2026/5/24 21:03:13

03. 内存屏障

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
03. 内存屏障

1.内存屏障


1.内存屏障

1).内存屏障简介 内存屏障是CPU和编译器的"交通信号灯",用来阻止指令乱序执行,强制缓存数据同步,解决多线程下的可见性和有序性

2).为什么需要内存屏障 我们写代码时,默认指令是按顺序执行的,但CPU和编译器为了提升效率,会执行以下操作 a.指令重排 编译器/CPU会打乱指令的执行顺序(只要不影响单线程逻辑),比如你写了A=1,B=2,CPU可能先执行B=2,再执行A=1单线程不会出现问题,但多线程会出大问题 b.缓存不一致 每个CPU核心都有自己的缓存(速度比内存快N倍),一个核心修改了变量(比如把isLoaded=true写到缓存),另一个核心可 能还在读缓存里的旧值(isLoad=false),导致"明明写了, 另一个线程却看不到"
// 线程1:加载资源并标记状态boolisLoaded=false;Objectresource=LoadBigResource();// 耗时操作isLoaded=true;// 线程2:检测状态并使用资源while(!isLoaded){}UseResource(resource);// 理论上isLoaded=true时,resource一定加载好了?
实际运行中,CPU可能对线程1做指令重排,先执行isLoaded=true,再执行LoadBigResource();结果就是线程2看到 isLoaded=true,直接执行UseResource,但此时加载资源未完成,会出现报错

3).内存屏障的两个作用 a.禁止指令重排 屏障前的指令必须全部执行完,才能执行屏障后的指令;比如再LoadingResource()和isLoaded=true之间加屏障,CPU就 不会把isLoaded=true提前执行 b.强制缓存同步 屏障会让核心把缓存里的修改刷写到内存(写屏障)或从内存重新读取最新数据(读屏障),让所有核心看到的变量值是一致的 比如线程1加写屏障,isLoaded=true会立刻同步到内存;线程2加读屏障,会放弃自己的旧屏障,去内存读最新的isLoaded

4).常见的内存屏障类型 a.写屏障(StoreBarrier):核心是写后同步,保证屏幕前的所有写操作,都刷到内存,让其核心可见 b.读屏障(LoadBarrier):核心是读前刷新,保证屏幕后的所有读操作,都从内存读取最新值,不是缓存旧值 c.全屏障(FullBarrier):同时禁止读写重排,强制读写都同步

5).在C#/Unity里,怎么用内存屏障 a.volatile关键字 给变量加volatile,相当于给这个变量的读写加了轻量级内存屏障:禁止指令重排,强制读写走内存而非缓存volatileboolisLoaded=false;// 加volatile
b.Thread.MemoryBarrier()手动插入全屏障,适合需要精确控制的场景Objectresource=LoadBigResource();Thread.MemoryBarrier();// 屏障:前面的写操作必须完成并同步isLoaded=true;
c.原子操作(Interlocked类)Interlocked.Increment/CompareExchange等方法,底层都带内存屏障,既保证原子性,又保证可见性和有序性
d.(lock)lock的Enter和Exit时,会自动插入全屏障,所以用lock的代码天然没有内存屏障问题(但锁的开销比volatile)

-内存屏障:只解决可见性、有序性,不保证原子性(比如i++这种非原子操作,加屏障也会有线程安全问题)-/原子操作:既保证原子性,又隐含内存屏障的功能
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 6:05:32

基于Android的随心行汽车租赁系统

摘要 在经济飞速发展,人民物质生活不断改善的今天,交通工具越来越多元化。而汽车租赁则是一种方便快捷的交通工具之一。但随着业务规模的扩大,传统的租赁管理方式已无法满足市场需求。纸质记录、人工操作不仅效率低下,还容易出错&…

作者头像 李华
网站建设 2026/5/23 5:54:02

SAP 会计凭证字段增强,结构zsfi_0001

增强点&#xff1a;ACC_DOCUMENT实施&#xff1a;ZME_ACC_DOCUMNET方法&#xff1a;CHANGEMETHOD if_ex_acc_document~change.DATA: wa_extension TYPE bapiparex,zext_data TYPE zsfi_0001.FIELD-SYMBOLS: <accit> TYPE accit.IF c_extension2[] IS NOT INITIAL.LOOP…

作者头像 李华
网站建设 2026/5/9 6:40:12

《动手构建大模型》零基础进阶大模型实战高手之路,系统学习LLM开发,成为实战型AI工程师!

简介 《动手构建大模型》是面向零基础读者的实战指南&#xff0c;通过三大篇章系统介绍大模型应用开发&#xff1a;基础理论篇讲解LLM核心架构与原理&#xff1b;核心技术篇详解提示词工程、RAG、框架工具使用&#xff1b;高阶应用篇深入智能体构建、模型微调与部署优化。本书采…

作者头像 李华
网站建设 2026/5/23 3:45:39

Open-AutoGLM本地部署性能实测:i7+32G内存能否扛住千亿参数推理?

第一章&#xff1a;Open-AutoGLM本地部署性能实测&#xff1a;i732G内存能否扛住千亿参数推理&#xff1f;在消费级硬件上运行千亿参数大模型曾被视为天方夜谭&#xff0c;但随着量化技术的成熟&#xff0c;Open-AutoGLM 的开源实现让这一目标逐渐成为现实。本次测试基于一台搭…

作者头像 李华
网站建设 2026/5/1 10:11:52

你可能不知道的Open-AutoGLM启动秘密:浏览器未打开的真实原因曝光

第一章&#xff1a;Open-AutoGLM为啥不打开我的浏览器当你启动 Open-AutoGLM 后发现本地服务已运行&#xff0c;但浏览器并未自动弹出访问页面时&#xff0c;这通常与配置策略或环境限制有关。该工具默认不会强制打开浏览器窗口&#xff0c;以避免在服务器或无图形界面的环境中…

作者头像 李华
网站建设 2026/5/10 7:19:53

17、ElasticSearch 聚合与脚本使用指南

ElasticSearch 聚合与脚本使用指南 一、ElasticSearch 聚合操作 在 ElasticSearch 中,聚合操作是非常强大的功能,它可以帮助我们对数据进行统计和分析。下面将介绍几种常见的聚合类型及其操作方法。 1. 统计缺失字段的文档数量 若要统计缺失 code 字段的文档数量,可使…

作者头像 李华