C# Parallel.For 创建数组:确定将 lock() 放在数组上
本文关键字:数组 lock For Parallel 创建 | 更新日期: 2023-09-27 18:37:28
我有一个耗时的静态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;
}
由于此处的array
是引用类型,在操作过程中未重新分配,并且尚未在其他地方公开(其他一些代码可以锁定它),是的,它可以作为锁定对象本身。但是,如果更新是针对数组的不同部分,即
array[i] = ... // i is separate
那么就没有必要锁定任何东西。