在单线程程序中,核心1中的线程所做的更改如何对另一个核心2可见,以便在上下文切换后,线程(现在在核心2上运行)将具有更新值?
考虑以下示例:
变量x
的主内存中的值为10.
线程在核心1上运行,并将x
更改为5,它仍然在缓存中,但尚未刷新到主内存,因为我们没有使用任何内存屏障。
发生上下文切换,线程从核心1移动到核心2。
该主题读取x
。
如果在上下文切换后线程在核心2中恢复执行,那么x
的值是多少?
如果“缓存一致性”管理一致性以处理上述情况,那么为什么我们需要在多线程程序中显式锁定(或任何读/写屏障)?
答案 0 :(得分:2)
考虑到您的第一个问题,上下文切换还会保留寄存器内容。因此,即使移动到另一个核心(或CPU),线程也会看到最新的值。
但是对于多线程程序,CPU 寄存器对于不同的线程是不同的(无论线程执行多少核心),并且寄存器不属于缓存一致性。
因此,我认为,多线程程序确实需要确保寄存器中的值与主存储器中的值保持同步。 (高速缓存一致性只能确保CPU高速缓存与内存保持同步)。 因此,我想,你需要一个屏障来同步寄存器和内存。
您可以理解为:程序本质上仅在主存储器上运行。但是,编译器优化对主存储器的访问,并使用寄存器进行中间操作。 因此,程序只访问存储器和寄存器。 但是,CPU还会引入自己的缓存内存。 内存(通过CPU)对内存的读取和写入由缓存优化。 缓存一致性仅在CPU内确保缓存是最新的(因此,访问内存的程序获取正确的值。)
总结一下: