1

我知道如何加入一个简单的线程以使父线程等待它们,但我不知道如何为 System.Threading.Tasks 命名空间中实现的自动线程执行此操作。这是一个例子。我在我想要分别执行的主要函数中调用了两个函数。每个函数里面都有一个 parallel.for 。现在如何让主线程在调用第二个函数之前等待第一个函数的所有线程完成?

static void Main(string[] args)
{
     fill();
     // now main should wait for threads of fill function to finish
     filter();
}

void filter()
{
     parallel.for(some action);
}

void fill()
{
    parallel.for(some action);
}
4

1 回答 1

3

Parallel.For 方法在多个线程之间进行内部分叉迭代,但随后它会阻塞直到它们全部完成。因此,从主要功能的角度来看,您的代码是一个序列代码:

我们分叉循环迭代的处理,并且我们加入使得并行循环调用仅在所有并发处理完成时完成。

如果您需要通过循环共享一些本地状态,请使用函数的Parallel.For Method (Int32, Int32, Func, Func, Action)版本:

public static ParallelLoopResult For<TLocal>(
    int fromInclusive,
    int toExclusive,
    Func<TLocal> localInit,
    Func<int, ParallelLoopState, TLocal, TLocal> body,
    Action<TLocal> localFinally
)

下图描述了它的工作原理:

在此处输入图像描述

以下是计算并行 PI 的示例实现:

static double ParallelPi()
{
    double sum = 0.0;
    double step = 1.0 / (double)NUM_STEPS;
    object obj = new object();
    Parallel.For(0, NUM_STEPS,
    () => 0.0,
    (i, state, partial) =>
    {
        double x = (i + 0.5) * step;
        return partial + 4.0 / (1.0 + x * x);
    },
    partial => { lock (obj) sum += partial; });
    return step * sum;
}

有关 Parallel 类如何与示例一起工作的深入信息,请阅读Patterns for Parallel Programming:Understanding and Applying Parallel Patterns with the .NET Framework 4(Blackquote、图像和示例取自那里)

于 2013-11-15T09:49:21.483 回答