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のキャッシュはただし、更新します)。
メモリバリアを配置すると、すべてのレジスタが強制的に「フラッシュ」されますか? レジスタとキャッシュの関係は?レジスタとメモリバリアはどうですか?