news 2026/7/2 2:14:47

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/7/1 23:06:34

用AIGC生成测试周报:从Jira、Git、CI日志中自动提炼关键指标

测试周报自动化转型的迫切性‌ 每周一,对于许多测试工程师而言,可能都是从整理上周的“数据残骸”开始:打开不同的浏览器标签页,登录Jira查看新增缺陷和待关闭的BUG,翻阅Git提交记录寻找与测试关联的代码变更&#xff…

作者头像 李华
网站建设 2026/7/2 2:11:52

hot100 160.相交链表

思路:1.算法流程:(1)初始化两个指针:p headA,q headB。(2)不断循环,直到p q。(3)每次循环,p和q各走一步。具体来说:如果p不是空节点…

作者头像 李华
网站建设 2026/6/26 1:52:59

为什么你的Open-AutoGLM总是黑屏:GPU驱动兼容性被严重低估的致命影响

第一章:Open-AutoGLM 执行黑屏现象的普遍性与误解在部署 Open-AutoGLM 模型推理服务时,部分开发者频繁反馈启动后界面呈现黑屏状态。这一现象并非程序崩溃,而多由环境配置、前端资源加载异常或模型初始化阻塞所致。社区中普遍存在将“视觉无响…

作者头像 李华
网站建设 2026/6/29 18:23:53

Open-AutoGLM性能优化全攻略(99%开发者忽略的关键细节)

第一章:Open-AutoGLM性能优化全攻略导论在大规模语言模型应用日益普及的背景下,Open-AutoGLM作为一款高效、可扩展的自动生成语言模型框架,其性能表现直接影响到推理延迟、吞吐量与资源利用率。为了充分发挥其潜力,系统性的性能优…

作者头像 李华
网站建设 2026/6/26 10:34:44

21、ElasticSearch 集群与节点监控全解析

ElasticSearch 集群与节点监控全解析 1. wait_for_nodes 功能 wait_for_nodes 用于等待集群中达到指定数量的可用节点。该参数的值可以是表达式,如 >N 、 >=N 、 <N 、 <=N 、 ge(N) 、 gt(N) 、 le(N) 或 lt(N) 。 2. 控制集群状态 2.1 准备…

作者头像 李华