4

我有一个耗时的静态 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;
}
4

1 回答 1

10

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

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

那么就没有必要锁定任何东西。

于 2012-06-15T06:14:58.857 回答