メモリバリアーリーアンドパラレルエクステンション
-
13-12-2019 - |
質問
並列拡張を使用するときは、メモリバリアーリーエリアについて心配する必要がありますか?
編集 - 元の質問が営業していたので詳述するには: (@xanatos 'の答えは私が探していたものでした)
具体例を与える:alser 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));
}
}
. 解決
労働者が他の労働者によって準備されたデータを必要としない場合(そのため、労働者1がAと労働者2を書き込む状況はない場合はaを読み込む)は、MemoryBarrier
の必要はありません。すべてのタスクが終了すると、Wait
として機能するMemoryBarrier
があります(最後に、すべての労働者が終了するのを待つ同期構成がある同期構成がある場合でも)すべてのタグコードです。
他のヒント
ここで1つのことを念頭に置いてください。キャッシュラインの無効化。それは複雑なトピックですが、ここでここでの素晴らしいMSDN記事。
は、2小道具だけであなたの特定の例を考えると、これはマイクロ最適化であり、心配するべきことではありません。あなたがそれを推定しようとしているのであったのであったことを知っているものだけ。
所属していません StackOverflow