1

当您跨不同处理器调度单个线程时,是否每次都必须清除缓存?如果不清除缓存,则不会发生以下情况:

假设您有以下(伪)代码由 2 个处理器 P1 和 P2 执行。

     1. foo() {
     2. int x=5;
     3. x=10;
     4. print x;
     5. }

最初,线程被调度在 P1 上,它执行第 1 行和第 2 行,并将 5 存储在其缓存中以用于 x 的内存位置(在堆栈上)。

然后线程被调度到执行第 3 行的 P2 上,并将 10 存储在缓存中以用于 x 的内存位置。

最后,线程再次被调度在 P1 上,并执行第 4 行,打印 5(x 在 P1 的缓存中的值)。

然而,我们显然希望打印 10 个。

4

1 回答 1

1

是的,处理器缓存/寄存器需要更新,或者至少刷新到主内存,因此如果线程迁移到另一个内核/处理器,它可以获取其最近的内存。

幸运的是,我们通常为其编写代码的常见服务器/桌面平台是缓存一致的,因此硬件负责所有使这项工作正常工作的魔法,并且操作系统无论如何都需要确保为线程/进程提供适当的内存在操作系统决定运行该线程的任何地方都可用。这不是应用程序代码需要担心的任务。

如果您使用的平台不是缓存一致的,您可能会知道 - 如果操作系统决定将线程迁移到,您使用的操作系统/线程库很可能会确保正确更新缓存另一个处理器。

于 2012-12-07T19:25:27.497 回答