0

あるスレッドで変数を作成した場合、別ManualResetEventWaitOne()スレッドが同じ変数に値を割り当ててEventWaitHandel. 最初のスレッドで変数を読み取るようになると、他のスレッドによって割り当てられたばかりの値を常に取得することが保証されますか?

(私が知る限り、メモリバリアを使用していないため、最適化のために CPU キャッシュから値を取得できなかったのではないかと心配しています)。

例えば

var str = "multi-threading is hard!";
var mre = new ManualResetEvent(false);
Task.Factory.StartNew(() => 
    {
        str = Console.ReadLine();
        mre.Set();
    ));
mre.WaitOne();
Console.WriteLine(str);
4

2 に答える 2

0

変数はキャプチャされた変数です。つまり、ラムダ式で使用しているため、コンパイラはこのローカル変数をコンパイラ生成クラスのフィールドに変換します。Afaik、これらのコンパイラ生成フィールドはマークされていないvolatileため、キャッシュされる可能性があります。

編集: 確かに、フィールドは揮発性ではありません。

コンパイラが作成する必要がないように、独自のクラスを作成することで、キャッシュを確実に防ぐことができます。ただし、これはもちろんコードの簡潔さを妨げます。

于 2014-02-21T09:03:11.687 に答える