2010-12-24 10 views
1

タスク(ファンクタ)のグローバル共有キューを持つ単純なスレッドプール。スレッドプール:実行中のタスクから子タスクを生成する方法は?

各ワーカー(スレッド)はワーカーから1つのタスクを取り出して実行します。この作業が終了するまで、次の作業は実行されません。

子タスクを生成してデータを生成する必要がある大きなタスクを想像してから、評価を続けます(たとえば、ディスクに保存する前に大きな配列をソートするなど)。タスクコードの

擬似コード:

do some stuff 
    generate a list of child tasks 
    threadpool.spawn (child tasks) 
    wait until they were executed 
    continue my task 

タスクが子タスクを待っている、とされているため、労働者が死んだロック、スレッドプールが終了する親タスクを待っているだろうという問題があります子供を走らせる前に。どのように私はすべてのタスクが効率的で、実行されたことを知ることができる、

threadpool.push (tasks) 
    while (not all incoming task were executed) 
     t = threadpool.pop() 
     t.run() 
    return (and continue executing parent task) 

しかし:

threadpool.spawnの擬似コード:

ひとつのアイデアは、スポーンコード内の子タスクを実行することです方法?ご意見

l = generate a list of child tasks 
    threadpool.push (l , high priority) 
    t = create a task to work with generated data 
    threadpool.push (t , lo priority) 

しかし、私は、これは非常に煩わしいた...

タスクの擬似コード:

もう一つのアイデアは...親タスクを分割するために、このようなものでしょうか?

pd。メリークリスマス! pd2。

+0

"問題は、タスクが子タスクを待機しており、子プールを実行する前に親タスクが終了するのをスレッドプールが待機しているため、作業者がデッドロックすることです。 - これはあなたが作っている前提ですか?親タスクが実行中であっても、子タスクを実行するスレッドプールがあります。 Java Executorsはこれを実行できます。 –

+0

どのような種類のcr * ppyスレッドプールですか?別のスレッドを実行する前にスレッドの完了が必要なスレッドプールはスレッドプールではありません。 –

+0

SB:ofc、しかし私は自分のスレッドプールをC++でコーディングしていますが、私はその機能を自分で実装する方法を尋ねています –

答えて

0

子スレッドが完了したときに子スレッドがメインワーカーに信号を返すようにする機構を持つことができます。 Javaでは、 ExecutorServiceスレッドプールに提出されたタスクは、結果をFutureのデータ構造として返答します。もう1つの方法は、スレッドが完了するたびに更新される共通のカウントダウンメカニズムとして機能する、CountDownLatchと同様の別個の完了信号を維持することです。

+0

私が言ったように、私はスレッドプールを使用しているので、私が作成できる新しいスレッドの数には限界があります。私の現在のタスクが他のスレッドを待っているとブロックすると、決して終了しません。子タスクを待っているすべてのスレッドで自分自身を見つけることができます。 –

関連する問題