2012-09-16 25 views
5

スレッドAが別のスレッドBを変数Vに書き込む単一の目的で生成し、それが終了するのを待っている場合、スレッド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

いずれかのメモリバリアが必要かどうかわかりません。もし彼らがそうだったら、Thread.Joinはかなり役に立たず、多くの人が困っているだろう。 Joinは、スレッドが終了するまで待機します。これには、変数に値を割り当てることが含まれます。 – Despertar

+0

このスレッドを見る:http://stackoverflow.com/questions/6581848/memory-barrier-generators – Laurijssen

答えて

0

それらが必要とされていないように見える文書から -

メモリバリアは、(例えば、複数のインテルItaniumプロセッサを使用するシステム)、弱いメモリ順序でマルチプロセッサシステムでのみ必要です。

ほとんどの場合、C#のlockステートメント、Visual BasicのSyncLockステートメント、またはMonitorクラスを使用すると、データを簡単に同期できます。

あなたがjoinでブロックするので、それはさらに必要ではありません。

0

最初のメモリバリアは不要です。 別のスレッドで変更されたデータにアクセスする前に、それらを呼び出す必要があります。 「スレッド」内でそうしているわけではないので、呼び出しは必要ありません。

Joinコールを維持する予定がある場合は、2番目のコールを取り除くことができます。 2回目の通話を続けると、参加を取り除くことができます。

3

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

+1

あなたの答えをありがとう。これをバックアップするためのドキュメント? – Ani

+1

@Ani:このソースでは:http://www.albahari.com/threading/part4.aspx(これまで誰もが知っていた)、彼らはフェンスを生成するものとしてほとんどすべての同期メカニズムについて言及しています。彼らは明示的に 'Join'を言及していませんが、例えば' Monitor.Wait'と同じ状態に呼び出しスレッドを置くので、強いヒントでもフェンスを生成するはずです。さらに、「タスク」を待つことも言及されている。スレッドに参加することは少し異なりますが、私は同じメモリ順序保証を提供することを期待しています。 – Tudor

+0

私はそれを読んだが、あなたが言うように、それが明示的に「結合」に言及していないので、それが決定的であったかどうかは確かではなかった。 – Ani

関連する問題