当涉及到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
}
(让's assume the compiler didn' t优化循环外'complete'的负载)
根据我的理解,更新"complete" isn 't visible to the second thread since it'的值保存在寄存器内(但CPU 2的缓存更新) .
是否设置内存屏障力来“刷新”所有寄存器?寄存器与缓存的关系是什么?那些寄存器和内存障碍呢?
2 回答
没有关系 . 使用“volatile”关键字 .
x86平台中使用的MESI协议保证了缓存一致性,即一个CPU缓存中的更改会自动传播到其他CPU缓存 . 因此,x86和x64上的volatile关键字仅用于防止重新排序 .