C#Parallel.For创建数组:确定将lock()放在数组上?

时间:2012-06-15 06:09:50

标签: c# performance locking task-parallel-library

我有一个耗时的静态C#方法来创建一个数组(double:s)并因此并行操作。

由于我在进入循环之前创建数组并且在此之后没有篡改其引用,我认为在并行循环中更新它时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;
}

1 个答案:

答案 0 :(得分:9)

由于此处的array是引用类型,因此在操作期间不会重新分配,并且尚未在其他地方公开(其中一些其他代码可以锁定它),是的,它可以作为锁对象本身就足够了。但是,如果更新是针对数组的不同部分,即

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

然后没有必要锁定任何东西。