gpt4 book ai didi

java - 单线程在多核处理器上的数据可见性

转载 作者:行者123 更新时间:2023-11-30 08:32:11 26 4
gpt4 key购买 nike

在单线程程序中,核心 1 中的线程所做的更改如何让另一个核心 2 可见,以便在上下文切换后线程(现在在核心 2 上运行)将具有更新值?

考虑以下示例:

  1. 变量 x 在主内存中的值为 10。

  2. 线程在核心 1 上运行并将 x 更改为 5,它仍在缓存中并且尚未刷新到主内存,因为我们没有使用任何内存屏障。

  3. 发生上下文切换,线程从核心 1 移动到核心 2。

  4. 线程读取x的值。

如果上下文切换后线程在核心 2 中恢复执行,x 的值是多少?

如果“缓存一致性”管理一致性来处理上述情况,那么为什么我们需要在多线程程序中显式锁定(或任何读/写屏障)?

最佳答案

考虑您的第一个问题,上下文切换还保留寄存器内容。因此,即使移动到另一个内核(或 CPU),线程也会看到最新的值。

但是对于多线程程序,CPU 寄存器对于不同的线程是不同的(不管线程执行了多少个核心),寄存器不是缓存一致性。

因此,我认为,多线程程序确实需要确保寄存器中的值与主内存中的值是最新的。(缓存一致性仅确保 CPU 缓存与内存保持同步)。因此,我想,您需要一个屏障来使寄存器与内存同步。

你可以这样理解:程序本质上只在主存上运行。但是,编译器优化了对主内存的访问并使用寄存器 进行中间操作。因此,程序只访问内存和寄存器。然而,CPU 也引入了它自己的内存缓存。内存的读取和写入由缓存在内部(由 CPU)优化。缓存一致性仅在 CPU 内确保缓存是最新的(因此,访问内存 的程序会获得正确的值。)

总结:

  • 缓存一致性确保缓存内存是最新的,它不受程序的控制,因为它是CPU 内部。
  • 上下文切换由操作系统处理,当它将线程移动到不同的核心时,它确保寄存器的值正确。
  • 内存屏障确保寄存器内存是最新的,这是程序必须确保的。

关于java - 单线程在多核处理器上的数据可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40256057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com