4

当涉及到 MESI 等缓存一致性协议时,CPU 寄存器和 CPU 缓存之间有什么关系?如果某个值存储在 CPU 的缓存中,并且还存储在寄存器中,那么如果缓存行被标记为“脏”会发生什么?据我了解,即使缓存已更新(由于 MESI),也无法保证寄存器会更新其值。

验证此代码:

 static void Main()  
  {  
  bool complete = false;   
  var t = new Thread (() =>  
  {  
    bool toggle = false;  
    while (!complete) toggle = !toggle;  
  });  
  t.Start();  
  Thread.Sleep (1000);  
  complete = true;  
  t.Join();        // Blocks indefinitely  
}

(假设编译器没有优化循环外“完成”的负载)据
我所知,第二个线程看不到“完成”的更新,因为它的值保存在寄存器中(CPU 2 的缓存是但是更新)。

放置内存屏障会强制“刷新”所有寄存器吗?寄存器与缓存的关系是什么?那么寄存器和内存屏障呢?

4

2 回答 2

4

没有关系。使用“volatile”关键字。

于 2009-12-26T18:20:56.570 回答
-1

x86 平台中使用的MESI 协议保证了缓存的一致性,即一个CPU 缓存中的更改会自动传播到其他CPU 缓存。因此,x86 和 x64 上的volatile关键字仅用于防止重新排序。

于 2009-12-26T18:49:28.587 回答