【发布时间】:2010-12-30 03:42:02
【问题描述】:
当涉及到 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 的缓存已更新)。
设置内存屏障是否会强制“刷新”所有寄存器?寄存器与缓存的关系是什么?那么寄存器和内存屏障呢?
【问题讨论】:
标签: multithreading cpu-architecture lock-free cpu-cache