CPU寄存器和高速缓存一致性

时间:2009-12-26 18:06:49

标签: multithreading cpu-architecture lock-free cpu-cache

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

Hench这段代码:

 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的缓存更新了)。

是否设置内存屏障力来“刷新”所有寄存器?寄存器与缓存的关系是什么?那些寄存器和内存障碍呢?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:-1)

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