1

これは単純化して、別の質問に絞り込むものです: D で DAG を並行して横断するのに助けが必要です

並列化したいコードがあるとします。問題は、あなたがしなければならないことのいくつかには前提条件があるということです。そのため、新しいタスクをプールに追加する前に、これらの前提条件が満たされていることを確認する必要があります。簡単な概念的な答えは、前提条件が完了したときに新しいタスクを追加することです。

ここに、そのパターンをエミュレートするコードの小さなチャンクがあります。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 に答える