Thread.MemoryBarrier()缓存刷新机制及代码变量内存读取疑问
关于Thread.MemoryBarrier()的内存可见性问题
首先得澄清一个常见误区:Thread.MemoryBarrier()不是直接强制变量“从主内存取值”,它核心管的是指令不能乱序重排和修改要让其他线程可见这两件事。
看你给出的代码,所有行都是赋值(写操作),根本不存在“从主内存获取值”的行为——写操作是把值往内存里存,不是从内存读取。不过还是按内存屏障的规则给你拆解清楚:
屏障前的
_a、_b赋值:
内存屏障会确保这两个写操作必须在屏障执行前全部完成,而且它们的修改会被刷新到主内存(或其他线程能读取到的缓存区域),保证后续其他线程读这两个变量时,能拿到最新的赋值结果。但这俩操作本身是往外写,不需要从主内存读取数据。屏障后的
_c、_d赋值:
内存屏障会阻止CPU把这两个写操作提前到屏障前面执行,同时,这些赋值的结果也会保证对后续的读操作(不管是当前线程还是其他线程)可见。同样,这也是写操作,不存在从主内存取值的情况。
如果你的代码里有读操作(比如var temp = _c;),那情况就不一样了:屏障之后的读操作会强制读取主内存的最新值,而屏障之前的读操作可能还会使用寄存器或缓存里的旧值,没有强制从主内存读取的保证。
内容的提问来源于stack exchange,提问作者user22155685
相关产品推荐
相关产品推荐

