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

Tac*_*lff 4 parallel-processing concurrency d task wait

这与我之前的问题有关:D并发写入缓冲区

假设您有一段由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
}
Run Code Online (Sandbox Code Playgroud)

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

dsi*_*cha 6

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

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

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

foreach(ref elem; parallel(array)) {
    job2(elem);
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Daevius:如果你想迭代奇数索引,你可以使用std.range.stride或foreach(i; parallel(std.range.iota(1,array.length,2)).std.parallelism是用假设这种灵活性将由std.algorithm和std.range中的高阶范围提供,而不是必须在std.parallelism的设计中明确地规划它. (4认同)