Parallel.For "Thread local state"
Parallel.For "Thread local state"
我的问题是: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);
}
My question is: The third parameter in the parallel.for, what does it do?
这是一个每个线程执行一次的 Func。如果你的循环需要线程局部变量,这是你初始化它的地方。
编辑:
一步一步:
(i, state, interimResult) => interimResult + 1,
你明白吗interimResult
是你的局部变量,就是你初始化为0d的那个?
对于 () => 3d
,result
将是 32 + 3 * t
,其中 t
是使用的线程数。 3d
作为 interimResult
传递给每个线程中对 body
的第一次调用。
Parallel.For
的全部目的是在多个线程上分配工作。所以 interimResult + 1
正好执行了 32 次(可能在不同的线程上)。但是每个线程都必须有一些 interimResult
的初始值。这是 return 由 localInit
编辑的值。
因此,如果作品分布于例如两个三分之一,每个做 + 1
16 次,因此计算 3 + 16
。最后,部分结果相加得到 6 + 32
.
简而言之,在这个例子中,localInit
到 return 与 0d
不同的东西没有多大意义。
我的问题是: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);
}
My question is: The third parameter in the parallel.for, what does it do?
这是一个每个线程执行一次的 Func。如果你的循环需要线程局部变量,这是你初始化它的地方。
编辑:
一步一步:
(i, state, interimResult) => interimResult + 1,
你明白吗interimResult
是你的局部变量,就是你初始化为0d的那个?
对于 () => 3d
,result
将是 32 + 3 * t
,其中 t
是使用的线程数。 3d
作为 interimResult
传递给每个线程中对 body
的第一次调用。
Parallel.For
的全部目的是在多个线程上分配工作。所以 interimResult + 1
正好执行了 32 次(可能在不同的线程上)。但是每个线程都必须有一些 interimResult
的初始值。这是 return 由 localInit
编辑的值。
因此,如果作品分布于例如两个三分之一,每个做 + 1
16 次,因此计算 3 + 16
。最后,部分结果相加得到 6 + 32
.
简而言之,在这个例子中,localInit
到 return 与 0d
不同的东西没有多大意义。