多线程我有以下代码:读写共享阵列
const int MAX = 101;
const int MIN_COMBINATORIC = 1000000;
int[,] pascalTriangle = new int[MAX, MAX];
Parallel.For(0, MAX, i =>
{
pascalTriangle[i, 0] = 1;
pascalTriangle[i, i] = 1;
});
int counter = 0;
Parallel.For(0, MAX, x => Parallel.For(1, x, y =>
{
int value = pascalTriangle[x - 1, y] + pascalTriangle[x - 1, y - 1];
Interlocked.Exchange(ref pascalTriangle[x, y], value < MIN_COMBINATORIC ? value : MIN_COMBINATORIC);
if(value > MIN_COMBINATORIC)
Interlocked.Increment(ref counter);
}));
Console.WriteLine("Result: {0}", counter);
的问题是,有时打印出正确答案(Result: 4075
),但有时它打印一个随机的(和错误的)答案,如:
Result: 1771
Result: 0
我猜这与我正在读写多线程之间共享数组的事实有关。 正如你所看到的,我尝试添加Interlocked.Exhange()
线程安全的写操作,但我无法找到一个类似的方法,用于读取(有一个Interlocked.Read()
但它只能读取long
变量)
我怎样才能让上面的代码以线程安全的方式并发运行?
它可以通过使用一些同步原语使线程安全,但我不确定它会工作,因为它似乎依赖于以前的计算,并行运行时可能不完整。 –