当涉及到 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 的缓存是但是更新)。
放置内存屏障会强制“刷新”所有寄存器吗?寄存器与缓存的关系是什么?那么寄存器和内存屏障呢?