用于共享内部变量的C#并行
嗨,我正在处理以下代码:用于共享内部变量的C#并行,c#,multithreading,parallel-processing,C#,Multithreading,Parallel Processing,嗨,我正在处理以下代码: Parallel.For(1, residRanges.Count, i => { int count = 0; List<double> colAList = new List<double>(); List<double> colBList = new List<double&
Parallel.For(1, residRanges.Count, i =>
{
int count = 0;
List<double> colAList = new List<double>();
List<double> colBList = new List<double>();
for (int x = 0; x < residErrorData.Count; x++)
{
foreach (pricateConnection in residErrorData[x].connList)
{
if (residRanges[i].connection == nc.connection)
{
colAList.Add(residErrorData[x].residualError);
colBList.Add(nc.freq);
count = count + 1;
}
}
}
colA = new double[count];
colB = new double[count];
for (int j = 0; j < count; j++)
{
colA[j] = colAList[j];
colB[j] = colBList[j];
}
residRangeError tempresid = residRanges[i];
tempresid = fitResid(tempresid, colA, colB);
residRanges[i] = tempresid;
residRanges[i].n = count;
}
});
Parallel.For(1,residRanges.Count,i=>
{
整数计数=0;
List colAList=新列表();
List colBList=新列表();
对于(int x=0;x
如果我不使用并行类,我的值似乎是准确的,但是当我出于某种原因使用并行类时,它会混淆colA和colB的值。它把它们混合在线程之间。我对并行处理相当陌生,但我一直在四处寻找,似乎找不到任何解决方案。有人知道为什么程序似乎在线程之间共享变量吗
我知道代码并不理想,我一直在尝试不同的方法来找出哪里出了问题。我现在不想对它进行必要的优化,而是想了解为什么不同循环中的变量没有保持分离
residRanges[]是类项目的列表。使用它的for循环似乎得到了正确的值,当并行运行时,它们只是开始混淆哪些值在哪里
谢谢你的帮助!我真的可以用它 (转载作为甜蜜、甜蜜业力的答案)
您的代码看起来好像colA
和colB
在lambda的作用域之外声明,这意味着变量引用可以引用不同的数组对象,因为不同的线程同时运行(例如,线程0将更改colA
,而线程1位于j内
将colA
和colB
的声明移动到lambda内部:
...
Double[] colA = new double[count];
Double[] colB = new double[count];
for (int j = 0; j < count; j++)
...
闭包中还包含哪些其他变量?您可能正在进行线程不安全写入。我认为问题在于您正在将colA
和colB
从lambda中提升出来。将它们移动到局部范围。@Dai完全正确colA
和colB
是并行内部计算的局部,请尝试更改 colA=new double[count];
tovar colA=new double[count];
与colB相同非常感谢!这很有道理,我忘了我已经在循环之外创建了这些变量。非常感谢!
...
residRanges[i] = fitResid( residRanges[i], colAList, colBList );
residRanges[i].n = count;
...