質問

並列拡張を使用するときは、メモリバリアーリーエリアについて心配する必要がありますか?

編集 - 元の質問が営業していたので詳述するには: (@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があります(最後に、すべての労働者が終了するのを待つ同期構成がある同期構成がある場合でも)すべてのタグコードです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top