まず第一に、私はそれがクラスlock{}
のための合成砂糖であることを知っています。Monitor
(ああ、糖衣構文)
私は単純なマルチスレッドの問題で遊んでいましたが、メモリの任意のWORDをロックすると、他のすべてのメモリがキャッシュされないようにする方法を完全に理解できないことがわかりました。レジスタ/ CPUキャッシュなどです。コードサンプルを使用して、私が言っていることを説明する方が簡単です。
for (int i = 0; i < 100 * 1000 * 1000; ++i) {
ms_Sum += 1;
}
結局、もちろん予想されるものms_Sum
が含まれます。100000000
ここで、同じサイクルを2つの異なるスレッドで実行し、上限を半分にしてエージングします。
for (int i = 0; i < 50 * 1000 * 1000; ++i) {
ms_Sum += 1;
}
同期がないため、誤った結果が得られます。私の4コアのマシンでは、ほぼ乱数で52 388 219
あり、の半分よりわずかに大きくなってい100 000 000
ます。で囲むms_Sum += 1;
とlock {}
、当然のことながら、絶対に正しい結果が得られます100 000 000
。しかし、私にとって興味深いのは(実際には、同じような動作を期待していたと言っている)、lock
前の行と後のms_Sum += 1;
行を追加すると、答えがほぼ正しくなることです。
for (int i = 0; i < 50 * 1000 * 1000; ++i) {
lock (ms_Lock) {}; // Note curly brackets
ms_Sum += 1;
}
この場合、私は通常ms_Sum = 99 999 920
、非常に近い値を取得します。
質問:なぜlock(ms_Lock) { ms_Counter += 1; }
プログラムを完全に正しくするのにlock(ms_Lock) {}; ms_Counter += 1;
、ほとんど正しくするのか。任意のms_Lock
変数をロックすると、メモリ全体がどのように安定しますか?
どうもありがとう!
PSマルチスレッドに関する本を読みに行きました。
同様の質問