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

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++这种非原子操作,加屏障也会有线程安全问题)-/原子操作:既保证原子性,又隐含内存屏障的功能
http://www.gsyq.cn/news/147253.html

相关文章:

  • 2025年比较好的意大利四段力铰链/耐用四段力铰链厂家最新推荐排行榜 - 品牌宣传支持者
  • 《动手构建大模型》零基础进阶大模型实战高手之路,系统学习LLM开发,成为实战型AI工程师!
  • 三大信号、一个前提:判断你企业入场数据中台的最佳时机
  • 计算机毕业设计springboot校园运动场地预约系统 高校体育场地在线预约平台的设计与实现 基于SpringBoot的校园运动场馆智能预订系统
  • 探秘网红景区:灵龙谷——亲子游与高性价比服务的绝佳之选 - mypinpai
  • SwiftUI Accessibility Masterclass
  • 计算机毕业设计springboot同城伴宠平台的设计与实现 基于SpringBoot的同城宠物托管与交流平台研发 SpringBoot驱动的同城宠物互助服务系统的设计与落地
  • 2025年热门遮白发染发剂品牌选购指南:温和安全易操作,植萃滋养款实测 - 资讯焦点
  • 基于微信小程序的个性化点餐系统任务书
  • 基于微信小程序的个性化新闻推荐系统的设计与实现开题报告1每页格式不得改动
  • [css特性]HTML Learn Data Day 3
  • GPT-SoVITS语音风格迁移实战:模仿明星声线全记录
  • 22、Elasticsearch 中的分面搜索与建议器使用指南
  • 2025年知名的导热油炉十大品牌厂家推荐及采购参考 - 品牌宣传支持者
  • Ubuntu22.04 安装搜狗输入法(含解决edge浏览器无法使用)
  • 2025哈氏合金过滤洗涤干燥三合一设备厂家排名,实验型/喷涂型设备专业供应商推荐 - 工业推荐榜
  • 基座模型如何决定Open-AutoGLM上限?一文看懂GLM-Edge架构优势
  • 品牌策划公司排名揭示:跨界战略成企业布局大健康重要力量 - 速递信息
  • 2025年诚信的小型喇叭排行榜,精选小型喇叭加工厂与迷你喇叭厂家推荐 - myqiye
  • 2025年北京私人定制旅游品牌企业排行榜,精选私人定制旅游公司推荐 - mypinpai
  • vant4修改disabled文本颜色
  • 超声波焊接设备哪家企业口碑好?2025年度用户好评较多的行业标杆企业分享 - 品牌推荐大师
  • 24、Elasticsearch 高级搜索功能详解
  • python调用lua [ 测试可用 ]
  • 上海做 GEO AI 优化服务如何选?精选三家AI搜索优化服务 口碑与实力双维度分析 - 资讯焦点
  • 探秘国内网红景区,解锁灵龙谷的独特魅力 - myqiye
  • vue基于Spring Boot框架游戏账号估价交易平台的设计与实现_zf488w26
  • 2025年高速精密冲床制造厂选哪家好?五大口碑高速冲床厂家推荐 - mypinpai
  • Open-AutoGLM乱码问题深度解析(专家级排错指南)
  • 完整教程:基于ElasticSearch的语义检索学习-向量化数据、向量化相似度、向量化检索