当涉及到 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/