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的所有任务完成?
我假设你正在使用std.parallelism?我写了std.parallelism,所以我会告诉你一个设计决定.在join
std.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核心.
归档时间: |
|
查看次数: |
250 次 |
最近记录: |