多线程环境下线程因CPU核心切换读取脏数据是否可能?(ARM架构)
多线程共享变量缓存异常场景的可能性分析(ARM架构)
这个场景完全有可能发生,尤其是在采用弱内存模型的ARM架构CPU上,具体原因如下:
- ARM属于弱一致性内存模型,默认情况下不保证写操作对所有核心的即时可见性,也不强制核心间缓存的自动同步。如果线程A对共享变量的两次写操作(设为1、设为2)没有配合内存屏障指令(比如ARM的
dmb),也没有将变量声明为原子类型或volatile,那么这些写操作可能仅更新了线程A当时所在核心的L1缓存,并未同步到其他核心的缓存或主存。 - 当操作系统将线程A调度到线程B曾使用的核心时,该核心的L1缓存中还保留着线程B之前读取的旧值1。由于线程A的第二次写2操作并未同步到这个核心的缓存,此时线程A读取该变量时会直接从本地L1缓存获取旧值,出现“变量值意外回滚”的异常。
- 即使共享变量仅由线程A修改,缓存一致性协议(如ARM的MESI衍生协议)也不会主动同步所有核心的缓存——只有当不同核心对同一地址产生读写冲突时,才会触发缓存同步动作。线程A的写操作如果未触发全局同步,其他核心的缓存旧值会持续保留。
- 线程跨核心迁移是多核心系统中操作系统调度的正常行为,这让上述缓存不一致场景的发生具备了现实可能性。
内容的提问来源于stack exchange,提问作者pippo
相关产品推荐
相关产品推荐

