2010-12-18 3 views
2
using System; 
using System.Threading; 
using System.Threading.Tasks; 

class Program 
{ 
    static void Main() 
    { 
     double[] numbers = new double[10000]; 

     Parallel.For(0, 9999, index => numbers[index] = index * 3); 

     Thread.MemoryBarrier(); 

     // do something with numbers 
    } 
} 

上記のMemoryBarrier()が必要ですか、Parallel.Forに「組み込み」のメモリバリアがありますか?このコードでは、MemoryBarrierは必要ですか?

答えて

4

Parallelを実行するときにメモリバリアは必要ありません。関数を呼び出すスレッドがタスクの終了を待つ場合、待機すると、おそらくシンクロナイザーを使用して待機中のスレッドに通知し、シンクロナイザーがリリースバリアを持つ必要があると通知すると、上記のコードで行われたすべての変更がグローバルに表示されるため、memory.barrierは不要です。

関連する問題