Вопрос

Какова связь между регистрами процессора и кэшем процессора, когда речь заходит о протоколах согласованности кэша, таких как 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 был обновлен).

заставляет ли установка барьера памяти "сбрасывать" все регистры?каково отношение регистров к кэшу?а как насчет регистров и барьеров памяти?

Это было полезно?

Решение

Здесь нет никаких отношений.Используйте ключевое слово "volatile".

Другие советы

Протокол MESI, используемый на платформе x86, гарантирует согласованность кэша, т.е.изменения в кэше одного процессора автоматически распространяются на кэши других процессоров.Следовательно изменчивый ключевое слово на x86 и x64 полезно только для предотвращения переупорядочивания.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top