4

(:s の) 配列を作成するための時間のかかる静的 C# メソッドdoubleがあるため、操作を並列化しました。

ループに入る前に配列を作成し、その後はその参照を改ざんしていないのでlock、並列ループ内で更新しながら配列自体をいじればよいと考えています。

アレイ自体で問題ありませlockんか、それともこのアプローチでパフォーマンスやデッドロックの問題に直面する可能性がありますか? lockロックをかけるために別の変数を作成する方が良いですか?

説明するサンプルコードを次に示します。

static double[] CreateArray(int mn, int n)
{
  var localLock = new object();    // Necessary?
  var array = new double[mn];

  Parallel.For(0, n, i =>
  {
    ... lengthy operation ...

    lock (array)    // or is 'lock (localLock)' required?
    {
      UpdatePartOfArray(array);
    }
  });

  return array;
}
4

1 に答える 1

10

ここは参照型であり、操作中に再割り当てされず、他の場所(他のarrayコードがロックできる場所)にまだ公開されていないため、はい、ロックオブジェクト自体として十分です。ただし、更新がアレイのさまざまな部分に対するものである場合、つまり

array[i] = ... // i is separate

そうすれば、何もロックする必要はありません。

于 2012-06-15T06:14:58.857 に答える