1

这是我的另一个问题的简化和缩小: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");
    }
}
4

1 回答 1

1

我修好了:http ://dpaste.dzfl.pl/eb9e4cfc

我将 for 循环更改为:

void cleanNodeSimple(Node node, TaskPool pool){
    node.doProcess();
    foreach (cli; pool.parallel(node.clients,1)){ // using parallel to make it concurrent
        if (cli.canProcess()) {
            cleanNodeSimple(cli, pool); 
            // no explicit task creation (already handled by parallel)
        }
    }
}
于 2013-10-25T09:00:11.017 回答