3

MSDN

我的问题是:parallel.for中的第三个参数,它是做什么的?

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

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

我现在尝试添加锁。而且它不只是将 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);
}
4

2 回答 2

2

With () => 3d, resultwill be 32 + 3 * t,t使用的线程数在哪里。3d传递interimResultbody每个线程内的第一次调用。

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

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

简而言之,在这个例子中,localInit返回不同于0d.

于 2015-08-17T09:23:50.310 回答
0

我的问题是:parallel.for中的第三个参数,它是做什么的?

这是一个函数,每个线程执行一次。如果您的循环需要线程局部变量,则可以在此处对其进行初始化。

编辑:

一步步:

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

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

于 2015-08-17T08:46:47.683 回答