gpt4 book ai didi

c# - 阶乘的答案不相同(平行和正常)

转载 作者:行者123 更新时间:2023-11-30 15:06:02 25 4
gpt4 key购买 nike

为什么下面的答案不一样?

正常编码:

long sum = 0;

for (long i = 1; i <= 10; i++)
{
long result = 1;

for (long j = 1; j <= i; j++)
{
result = result*j;
}
sum = sum + result;
}

并行编码:

long sum = 0;

Parallel.For(1, 10, delegate(int i)
{
long result = 1;

Parallel.For(1, i, delegate(int j)
{
result = result*j;
});

sum = sum + result;
});

请告诉我正确的方法

for (long i = 1; i <= 5; i++)
{
sum = sum * i;
}

Parallel.For(1, 5, delegate(int i)
{
sum = sum * i;
});

并行结果=24

正常结果 = 120

最佳答案

并行版本的答案是任意的,因为sumresult 由不同的线程访问和修改。所以你应该做的是将计算每一步和总结结果分开。为了能够正确地汇总结果,您需要获得一个锁,以便线程以独占方式修改 sum。一种修复方法可能是:

long sum = 0;
object monitor = new object();
Parallel.For(1, 11, () => 0L, (i, state, local) =>
{
long result = 1;

for (long j = 1; j <= i; j++)
{
result = result*j;
}
return local + result;
}, local => { lock (monitor) sum += local; });

请注意,您很少需要两个嵌套的 Parallel.For 循环,因为它们通常会导致性能不佳。因此,建议在最外层使用一个 Parallel.For 循环并保持内部 for 循环。此外,为了获得一些加速,您必须使用比 10 大得多的数字进行测试。

关于c# - 阶乘的答案不相同(平行和正常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8370917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com