当您跨不同处理器安排单个线程时,是否每次都必须清除缓存?如果未清除缓存,则不能发生以下情况:
假设您有2个处理器P1和P2执行以下(伪)代码。
1. foo() {
2. int x=5;
3. x=10;
4. print x;
5. }
最初,线程在P1上进行调度,P1执行第1行和第2行,并在其缓存中存储5个x的内存位置(在堆栈上)。
然后在P2上调度该线程,该线程执行第3行,并在 缓存中存储10个x的内存位置。
最后,线程再次在P1上调度,执行第4行,打印5(P1的缓存中的x值)。
但我们显然希望打印10张。
答案 0 :(得分:1)
是的,处理器缓存/寄存器需要更新,或至少刷新到主内存,因此如果线程迁移到另一个核心/处理器,线程可能会获得最近的内存。
幸运的是,我们通常编写代码的公共服务器/桌面平台为cache coherent,因此硬件会处理所有使这项工作正常工作的魔力,而操作系统无论如何都需要确保正确的内存在操作系统决定运行该线程的任何地方都可以使用给定的线程/进程。这不是应用程序代码需要担心的任务。
如果您的平台不是缓存一致的,您可能知道 - 如果操作系统决定迁移,您使用的操作系统/线程库很可能会确保缓存已正确更新一个线程到另一个处理器。