1

Parallel Extensionsを使用する場合、MemoryBarriersについて心配する必要はありますか?MemoryBarriersとParallel Extensions

編集 - 元の質問が開いていたとして詳しく説明するが終了: (@xanatos'答えは私が探していたものだった)

具体的な例を与えるために:私はParallel.ForEachを使用すると仮定し、各反復クラス内のプロパティの値を設定します(各反復では固有のプロパティが設定されますが、2回の繰り返しでは同じプロパティの値は設定されません)。 Parallel.ForEachを呼び出した同じスレッドで、私はParallel.ForEachから設定されたプロパティにアクセスします。

class Program 
{ 
    static void Main(string[] args) 
    { 
    var t = new Test(); 
    t.InitializePropertiesInParallel(); 
    var a = t.PropA; // Could never be 0? 
    var b = t.PropB; // Could never be 0? 
    } 
} 

public class Test 
{ 
    public int PropA { get; set; } 
    public int PropB { get; set; } 

    public void InitializePropertiesInParallel() 
    { 
    var initializers = new List<Action<int>>() 
    { 
     i => PropA = i, 
     i => PropB = i 
    }; 

    initializers.AsParallel().ForAll(a => a(1)); 
    } 
} 
+0

それはあなたが並行して行うことによって異なります。 – SLaks

+0

詳細をご記入ください。現在の形では、あなたの質問は少し自由です。 –

+0

要望どおりに精緻化。 – dugas

答えて

1

すべての労働者はMemoryBarrierの必要がない(作業者1は、A及び作業員2がAを読み込み書き込みどのような状況が存在しない)、他の研究者により作成されたデータを必要としない場合。すべてのタスクが終了すると、MemoryBarrierとして機能するWaitがあります(最終的には、表示されない場合でも、すべての作業者が終了するのを待つ同期構成があります)。

2

キャッシュラインの無効化を念頭に置いてください。複雑なトピックですが、a great MSDN article on it hereがあります。

この特定の例の要点は、同じオブジェクトインスタンスを2つの異なるスレッドから変更しているため、メモリ内の全く同じ場所に触れていなくても、同じキャッシュに触れようとしていることですプロセッサ1上の第1のスレッドがメモリを変更すると、キャッシュはフラッシュされ、プロセッサ2がそれに再び読み書きする前に更新される。

これは、わずか2つの小道具で具体的な例を考えてみると、これはマイクロ最適化であり、心配することは絶対にありません。あなたがそれに外挿するべきかどうかを知るためのちょうど何か。

+1

+1これはパフォーマンスの問題であり、データの正確さではないことに注意することが重要です。 – xanatos

+0

非常に興味深い - ありがとう。 – dugas