Parallel.For“线程本地状态”

时间:2015-08-17 08:42:49

标签: c# multithreading parallel.for

MSDN

我的问题是: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);
}

2 个答案:

答案 0 :(得分:2)

使用() => 3dresult将为32 + 3 * t,其中t是使用的线程数。 3dinterimResult传递给每个帖子中第一次调用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的变量相同?