这是我的另一个问题的简化和缩小:Need help parallel traversing a dag in D
假设您有一些要并行化的代码。问题是,你需要做的一些事情有先决条件。因此,在将新任务添加到池中之前,您必须确保完成了这些先决条件。简单的概念性答案是在先决条件完成时添加新任务。
在这里,我有一小段代码可以模拟这种模式。问题是,它会引发异常,因为pool.finish()
在工作线程将新任务放入队列之前调用它。有没有办法等到所有线程都空闲或什么的?或者是否有另一种允许这种模式的构造?
请注意:这是我的代码的简化版本,用于说明问题。我不能只taskPool.parallel()
在 foreach 中使用。
import std.stdio;
import std.parallelism;
void simpleWorker(uint depth, uint maxDepth, TaskPool pool){
writeln("Depth is: ",depth);
if (++depth < maxDepth){
pool.put( task!simpleWorker(depth,maxDepth,pool));
}
}
void main(){
auto pool = new TaskPool();
auto t = task!simpleWorker(0,5,pool);
pool.put(t);
pool.finish(true);
if (t.done()){ //rethrows the exception thrown by the thread.
writeln("Done");
}
}