Какова связь между регистрами ЦП и кешем ЦП, когда речь идет о протоколах когерентности кеша, таких как MESI? Если определенное значение сохраняется в кэше ЦП, а также хранится в регистре, то что произойдет, если строка кэша будет помечена как «грязная»? Насколько я понимаю, нет гарантии, что регистр обновит свое значение, даже если кэш был обновлен (из-за 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
}
(допустим, компилятор не оптимизировал загрузку для «завершения» вне цикла)
Насколько я понимаю, обновление до "complete" не видно для второго потока, поскольку его значение хранится в регистре (однако кэш CPU 2 был обновлен).
заставляет ли установка барьера памяти «сбрасывать» все регистры? какое отношение регистров к кешу? а как насчет регистров и барьеров памяти?