单线程

时间:2016-10-26 07:20:45

标签: java multithreading concurrency thread-safety multicore

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

考虑以下示例:

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

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

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

  4. 该主题读取x

  5. 的值

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

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

1 个答案:

答案 0 :(得分:2)

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

但是对于多线程程序,CPU 寄存器对于不同的线程是不同的(无论线程执行多少核心),并且寄存器不属于缓存一致性。

因此,我认为,多线程程序确实需要确保寄存器中的值与主存储器中的值保持同步。 (高速缓存一致性只能确保CPU高速缓存与内存保持同步)。 因此,我想,你需要一个屏障来同步寄存器和内存。

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

总结一下:

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