使用工作线程将新任务添加到D中的taskPool

时间:2013-10-25 08:21:18

标签: multithreading parallel-processing d

这是对我的另一个问题的简化和缩小:Need help parallel traversing a dag in D

假设您有一些要并行化的代码。问题是,您需要做的一些事情有先决条件。因此,在将新任务添加到池中之前,必须确保已完成这些先决条件。简单的概念性答案是在完成先决条件时添加新任务。

这里我有一小段代码可以模仿这种模式。问题是,它抛出一个异常,因为在工作线程将新任务放入队列之前调用pool.finish()。有没有办法等待'直到所有线程闲置或什么?或者是否有另一种允许这种模式的构造?

请注意:这是我的代码的简化版本,用于说明问题。我不能在foreach中使用taskPool.parallel()

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");
    }
}

1 个答案:

答案 0 :(得分: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)
        }
    }
}