5

スレッド A が、変数 V への書き込みのみを目的として別のスレッド B を生成し、それが終了するのを待つ場合、スレッド A での V の後続の読み取りが新鮮であることを保証するためにメモリバリアが必要ですか? 終了/参加操作にそれらを冗長にする暗黙の障壁があるかどうかはわかりません。

次に例を示します。

public static T ExecuteWithCustomStackSize<T>
    (Func<T> func, int stackSize)
{
    T result = default(T);

    var thread = new Thread(
        () => 
                {
                    result = func();
                    Thread.MemoryBarrier(); // Required?
                }
        , stackSize);

    thread.Start();
    thread.Join();

    Thread.MemoryBarrier(); // Required?
    return result;
}

上記のスニペットのバリアのいずれかまたは両方 (またはそれ以上) が必要ですか?

4

3 に答える 3

4

いいえ、同期メカニズムは暗黙的なメモリ フェンスを生成します。スレッドによって変更されたすべてのデータは、スレッドが結合された後に表示されます。

于 2012-09-16T15:09:42.470 に答える
0

ドキュメントから、それらは必要ないように見えます-

MemoryBarrierは、メモリの順序が弱いマルチプロセッサシステム(たとえば、複数のIntel Itaniumプロセッサを採用しているシステム)でのみ必要です。

ほとんどの場合、C#lockステートメント、Visual Basic SyncLockステートメント、またはMonitorクラスは、データを同期するためのより簡単な方法を提供します。

参加でブロックしているので、それはさらに必要ではありません。

于 2012-09-16T06:56:51.170 に答える
0

You don't need the first memory barrier. You only need to call them before accessing data that has been modified in a separate thread. Since you aren't doing so inside 'thread', you don't need the call.

You can get rid of the second one if you plan on keeping the Join call. If you keep the second call, you can get rid of Join.

于 2012-09-16T07:09:39.050 に答える