Parallel.For "Thread local state"

Parallel.For "Thread local state"

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);
}

My question is: The third parameter in the parallel.for, what does it do?

这是一个每个线程执行一次的 Func。如果你的循环需要线程局部变量,这是你初始化它的地方。

编辑:

一步一步:

(i, state, interimResult) => interimResult + 1,

你明白吗interimResult是你的局部变量,就是你初始化为0d的那个?

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

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

因此,如果作品分布于例如两个三分之一,每个做 + 1 16 次,因此计算 3 + 16。最后,部分结果相加得到 6 + 32.

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