多线程程序中的内存可见性与指令重排为何会破坏直觉,原子操作应如何建立正确顺序?
简答题困难822 次浏览
参考答案与解析
# 核心结论
多线程程序的直觉容易失效,是因为源代码中的先后顺序只约束单线程语义,并不天然等于其他线程观察到的顺序。编译器可在不改变单线程结果的前提下重排指令,处理器也可能乱序执行,并借助缓存和写缓冲延迟传播结果。因此,“线程一先写数据、再写就绪标志,线程二看到标志后读取数据”若只使用普通变量,可能出现线程二看到新标志却仍读到旧数据。正确做法是依据语言内存模型,使用锁、线程同步原语或具有适当内存序的原子操作建立明确的先行发生关系。
# 底层机制
原子性、可见性和有序性是不同问题。一次原子读改写不会被观察为中间状态,但这并不自动规定它与其他地址上的普通读写之间如何排序。缓存一致性协议通常能使各处理器核心最终对同一缓存行达
