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