タスク(ファンクタ)のグローバル共有キューを持つ単純なスレッドプール。スレッドプール:実行中のタスクから子タスクを生成する方法は?
各ワーカー(スレッド)はワーカーから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。
"問題は、タスクが子タスクを待機しており、子プールを実行する前に親タスクが終了するのをスレッドプールが待機しているため、作業者がデッドロックすることです。 - これはあなたが作っている前提ですか?親タスクが実行中であっても、子タスクを実行するスレッドプールがあります。 Java Executorsはこれを実行できます。 –
どのような種類のcr * ppyスレッドプールですか?別のスレッドを実行する前にスレッドの完了が必要なスレッドプールはスレッドプールではありません。 –
SB:ofc、しかし私は自分のスレッドプールをC++でコーディングしていますが、私はその機能を自分で実装する方法を尋ねています –