我的问题是:parallel.for中的第三个参数,它做了什么?
当我将其更改为()=> 1d,它将我的结果加倍,设置为两倍三倍,但忽略小数。
为什么忽略小数,如果它是某种加倍?那里到底发生了什么?
我现在尝试添加锁。并且它不仅仅将interimresult初始化为指定的值。
以下是我使用的代码:
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);
}
答案 0 :(得分:2)
使用() => 3d
,result
将为32 + 3 * t
,其中t
是使用的线程数。 3d
以interimResult
传递给每个帖子中第一次调用body
。
Parallel.For
的全部目的是将工作分配到多个线程上。所以interimResult + 1
正好执行了32次(可能在不同的线程上)。但每个线程必须具有interimResult
的初始值。这是localInit
返回的值。
因此,如果作品是在例如两个thred,每个th + 1
16次,因此计算3 + 16
。最后,将部分结果相加,得出6 + 32
。
简而言之,在这个示例中,localInit
返回与0d
不同的内容并没有多大意义。
答案 1 :(得分:0)
我的问题是:parallel.for中的第三个参数,它做了什么?
它是一个每个线程执行一次的Func。如果你的循环需要线程局部变量,那么就是你初始化它的地方。
编辑:
一步一步:
(i, state, interimResult) => interimResult + 1,
您是否理解interimResult
是您的本地变量,与您初始化为0d的变量相同?