在单个线程程序中,如何使内核1中的线程更改对另一个内核2可见,以便在上下文切换之后线程(现在运行在核心2上)具有更新的值?
请考虑以下示例:
x的主内存中的值为10。x更改为5,该线程仍然在缓存中,并且还没有刷新到主内存,因为我们没有使用任何内存屏障。x的值。如果线程在上下文切换后在核心2中恢复执行,那么x的值是多少?
如果“缓存一致性”管理一致性以处理上述情况,那么为什么在多线程程序中需要显式锁定(或任何读/写障碍)?
发布于 2016-10-26 12:01:24
考虑到您的第一个问题,上下文切换还保留注册内容。因此,即使移动到另一个核心(或CPU),线程也会看到最新的值。
但是对于多线程程序,CPU寄存器对于不同的线程是不同的(不管执行了多少个内核),寄存器不是缓存一致性的一部分。
因此,我认为多线程程序确实需要确保寄存器中的值与主内存中的值是最新的。(缓存一致性只确保CPU缓存与内存更新)。因此,我想,您需要一个屏障来使寄存器与内存同步。
您可以理解为:程序实际上只在主内存上运行。但是,编译器优化了对主内存的访问,并使用寄存器进行中间操作。因此,程序只访问内存和寄存器。然而,CPU也引入了自己的内存缓存。从/写入内存的读写在内部(由CPU)通过缓存进行优化。缓存一致性只确保CPU内部的缓存是最新的(因此,访问内存的程序获得正确的值)。
总括而言:
https://stackoverflow.com/questions/40256057
复制相似问题