D任务池等待所有任务完成

时间:2011-12-01 13:22:47

标签: concurrency parallel-processing task d wait

这与我之前的问题有关:D concurrent writing to buffer

假设您有一段由2个连续代码块A和B组成的代码,其中B依赖于A.这在编程中非常常见。 A和B都包含一个循环,每个迭代可以并行运行:

double[] array = [ ... ]; // has N elements

// A
for (int i = 0; i < N; i++)
{
    job1(array[i]); // new task
}

// wait for all job1's to be done

// B
for (int i = 0; i < N; i++)
{
    job2(array[i]); // new task
}

B只能在A完成时执行。在执行B之前,如何等待A的所有任务完成?

1 个答案:

答案 0 :(得分:6)

我假设你正在使用std.parallelism?我写了std.parallelism,所以我会告诉你一个设计决定。在std.parallelism的某些beta中实际上有一个join函数。它等待所有任务完成,然后关闭任务池。我删除了它,因为我意识到它没用。

原因是,如果您手动创建一组O(N)task个对象来迭代某个范围,那么您就会滥用该库。您应该使用并行的foreach循环,它会在将控制权释放回调用线程之前自动加入。你的例子将成为:

foreach(ref elem; parallel(array)) {
    job1(elem); 
}

foreach(ref elem; parallel(array)) {
    job2(elem);
}

在这种情况下,job1job2不应该启动新任务,因为并行foreach循环已经在使用足够的任务来充分利用所有CPU核心。