multithreading - CPU 寄存器和缓存一致性

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

当涉及到 MESI 等缓存一致性协议(protocol)时,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 的缓存已更新)。

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

最佳答案

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

关于multithreading - CPU 寄存器和缓存一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1963944/

相关文章:

multithreading - RxScala : How to keep the thread doing Observable.间隔还活着吗?

Java方法线程安全

c++ - 是否可以更快地执行更复杂的循环?

c++ - 在x64上使用非临时存储获取/释放语义

c - 扩展装配中 cmpxchg16b 的不可能约束

java - 为什么 FutureTask 中的结果对象是非 volatile 的?

java - Eclipse 调试器不适用于这两个小线程

java - CompletableFuture 的 obtrudeValue() 方法如何工作?

assembly - x86在x86-x64中不同或已完全删除的32位操作码

c++ - 逻辑/算术移位越少位越快吗?