首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单线程多核处理器上的数据可见性

单线程多核处理器上的数据可见性
EN

Stack Overflow用户
提问于 2016-10-26 07:20:44
回答 1查看 237关注 0票数 4

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

请考虑以下示例:

  1. 变量x的主内存中的值为10。
  2. 线程在内核1上运行,并将x更改为5,该线程仍然在缓存中,并且还没有刷新到主内存,因为我们没有使用任何内存屏障。
  3. 发生上下文切换,线程从核心1移动到核心2。
  4. 线程读取x的值。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-26 12:01:24

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

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

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

您可以理解为:程序实际上只在主内存上运行。但是,编译器优化了对主内存的访问,并使用寄存器进行中间操作。因此,程序只访问内存和寄存器。然而,CPU也引入了自己的内存缓存。从/写入内存的读写在内部(由CPU)通过缓存进行优化。缓存一致性只确保CPU内部的缓存是最新的(因此,访问内存的程序获得正确的值)。

总括而言:

  • 缓存一致性确保缓存和内存是最新的,它超出了程序的控制范围,因为它是CPU内部的。
  • 上下文开关由操作系统处理,确保在将线程移动到不同内核时寄存器的值正确。
  • 内存屏障确保寄存器和内存是最新的,这是程序必须确保的。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40256057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档