嗨,我在下面的代碼工作:C#並行共享內部變量
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;
}
});
如果我不使用並行類自己的價值觀似乎然而,當我使用並行類由於某種原因,要準確它會混合colA和colB的值。它在線程之間混合它們。我對並行處理相當陌生,但我一直在環顧四周,似乎無法找到任何解決方案。有誰知道爲什麼程序似乎在線程之間共享變量?
我知道代碼並不理想我一直在嘗試不同的事情來弄清楚發生了什麼問題。我並沒有試圖在此刻進行優化,理解爲什麼不同循環中的變量不會分開。
residRanges []是類項目的列表。 for循環使用它似乎得到正確的值,他們剛剛開始混淆了哪些值在Parallel.For中運行的位置。
感謝您的幫助!我真的可以使用它!
什麼其他變量包含在閉包中?您可能會遇到線程不安全的問題。我認爲問題在於你將'colA'和'colB'從lambda中提取出來。將它們移到本地範圍。 – Dai
@Dai總是右''colA'和'colB'是並行計算內部的本地,試着改變'colA = new double [count];'var var colA = new double [count];''colB' – csharpfolk
非常感謝你!這非常有道理,我忘了我已經在循環之外創建了這些變量。非常感謝! – HipposWild