1d 时,它使我的结果加倍,设置为两倍,但它忽略了小数。 如果它是某种加倍,为什么它忽略小数点?那-6ren">
gpt4 book ai didi

c# - 并行.For "Thread local state"

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

MSDN

我的问题是:parallel.for中的第三个参数,有什么作用?

当我将它更改为 ()=> 1d 时,它使我的结果加倍,设置为两倍,但它忽略了小数。

如果它是某种加倍,为什么它忽略小数点?那里到底发生了什么?

我现在尝试添加锁。而且它不只是将临时结果初始化为指定的值。

这是我使用的代码:

 static void RunParallelForCorrectedAdam()
{
object _lock = new object();
double result = 0d;
// Here we call same method several times.
// for (int i = 0; i < 32; i++)

Parallel.For(0, 32,
// Func<TLocal> localInit,
() => 3d,
// Func<int, ParallelLoopState, TLocal, TLocal> body,
(i, state, interimResult) =>
{
lock (_lock)
{
return interimResult + 1;
}

},
//Final step after the calculations
//we add the result to the final result
// Action<TLocal> localFinally

(lastInterimResult) =>
{
lock (_lock)
{
result += lastInterimResult;
}
}
);
// Print the result
Console.WriteLine("The result is {0}", result);
}

最佳答案

使用 () => 3dresult 将是 32 + 3 * t,其中 t 是使用的线程数。 3d 作为 interimResult 传递给每个线程中对 body 的第一次调用。

Parallel.For 的全部目的是将工作分配到多个线程上。所以 interimResult + 1 恰好执行了 32 次(可能在不同的线程上)。但是每个线程都必须有一些 interimResult 的初始值。这是 localInit 返回的值。

因此,如果工作分布在例如两个线程,每个线程执行 + 1 16 次,因此计算出 3 + 16。最后,部分结果相加得到 6 + 32

简而言之,在这个例子中,localInit 返回不同于 0d 的东西没有多大意义。

关于c# - 并行.For "Thread local state",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32046089/

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