这与我之前的问题有关: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的所有任务完成?
答案 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);
}
在这种情况下,job1
和job2
不应该启动新任务,因为并行foreach循环已经在使用足够的任务来充分利用所有CPU核心。