C# Parallel.For 创建数组 : OK to put lock() on the array?

标签 c# performance locking task-parallel-library

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

由于我是在进入循环之前创建数组并且之后没有篡改它的引用,所以我认为在并行循环中更新数组时锁定数组本身就足够了。

在数组本身上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;
}

最佳答案

因为这里的array 是一个引用类型,在操作期间不会被重新分配,也不会暴露在其他地方(一些其他代码可能会锁定它) ,是的,它可以作为锁定对象本身就足够了。但是,如果更新是针对数组的不同部分,即

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

那么就不需要锁定任何东西了。

关于C# Parallel.For 创建数组 : OK to put lock() on the array?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11045459/

相关文章:

c# - XmlSerializer 在定义为 XmlElement 的自闭标记后将 null 设置为属性

C# 数据集和 DbNull 值

c# - 在 String.Format 中转义大括号 '{'

c# - Entity Framework 代码优先 - 无法在对象 'db' 中插入重复键

vb.net - 我怎样才能简化和优化这个校验和代码?

c - efficiency int 与 long long 赋值

mysql - 如何处理多个连接

data-structures - 用Rust进行交接锁定

c - pthread_mutex_trylock 段错误

php - MySQL - 插入前 id "reservation"