假設我有一些Particle
S IN X,Y空間,我想他們正常化一切,使得平均X和Y是0PLINQ進行AsParallel()的ForAll()訪問資源
串行執行:
public void Normalise()
{
double avgX = 0.0;
double avgY = 0.0;
foreach (Particle p in Particles)
{
avgX += p.X;
avgY += p.Y;
}
avgX /= (double)Particles.Count;
avgY /= (double)Particles.Count;
foreach (Particle p in Particles)
{
p.X -= avgX;
p.Y -= avgY;
}
}
這個工作,而且性能也不錯,因爲它是爲O(n),但它的「易並行」。看看我的PLINQ實現:
public void PNormalise()
{
double avgX = 0.0;
double avgY = 0.0;
Particles.AsParallel().ForAll(p =>
{
avgX += p.X;
avgY += p.Y;
});
avgX /= (double)Particles.Count;
avgY /= (double)Particles.Count;
Particles.AsParallel().ForAll(p =>
{
p.X -= avgX;
p.Y -= avgY;
});
}
我不確定這裏的性能,但我會想象它會更好。問題是,粒子都是隨機跳躍的。我只能假設avgX
和avgY
上的+=
操作正在相互競爭,儘管它們已經相當原子了。
有什麼我可以做的,以解決它?我不能lock
他們,因爲他們不是對象,但我不確定我想要反正因爲不鎖定相當昂貴?
沒有「相當原子」這樣的東西,一個操作或者是原子的,或者不是。 – svick