4

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  
}

(コンパイラがループ外で「完全」の負荷を最適化していないと仮定しましょう)
私の理解では、値がレジスタ内に保持されているため、「完全」への更新は2番目のスレッドには表示されません(CPU 2のキャッシュはただし、更新します)。

メモリバリアを配置すると、すべてのレジスタが強制的に「フラッシュ」されますか? レジスタとキャッシュの関係は?レジスタとメモリバリアはどうですか?

4

2 に答える 2

4

関係はありません。「volatile」キーワードを使用します。

于 2009-12-26T18:20:56.570 に答える
-1

x86 プラットフォームで使用される MESI プロトコルは、キャッシュの一貫性を保証します。つまり、1 つの CPU キャッシュの変更は、他の CPU キャッシュに自動的に伝播されます。したがって、x86 および x64 でのvolatileキーワードは、並べ替えを防止する場合にのみ役立ちます。

于 2009-12-26T18:49:28.587 に答える