申し訳ありませんが、IntelのTBBを入手できていないようですが、サポートされているようですが、タスクの観点から並列処理を考えることに慣れていないので、使い方に頭を悩ませることはできません。スレッドとして。
私の現在のワークロードには、処理を継続するために作業をキューに送信するジョブがあります(再帰を考えてみてください。ただし、それ自体を呼び出す代わりに、作業をキューに送信します)。これをJavaで機能させる方法は、並行キュー(非ブロッキングキュー)と、キューを機能させたスレッドプールエグゼキューターを作成し、それに作業を送り返すことでした。しかし今、私はc ++で同様のことをしようとしていますが、TBBはプールを作成できることがわかりましたが、そのアプローチは大きく異なります(Javaスレッドはキューで動作している限り動作し続けるようですが、TBBはタスクを中断しているようです最初に)。
これが私が行うことの簡単なJavaの例です(この前に、必要なスレッド数などを設定しました):
static class DoWork implements Callable<Void> {
// queue with contexts to process
private Queue<int> contexts;
DoWork(Context request) {
contexts = new ArrayDeque<int>();
contexts.add(request);
}
public Void call() {
while(!contexts.isEmpty()) {
//do work
contexts.add(new int(data)); //if needs to be send back to the queue to do more work
}
}
}
TBBでこれを行うことは確かに可能ですが、送信した時点で作業が中断されているように見えるため、どうすればよいかわかりません。したがって、キューに2つのアイテムがある場合、2つのスレッドしか起動しない可能性がありますが、作業が増えるにつれて成長しません(8つのコアがある場合でも)。
誰かが私のタスクを達成する方法を理解するのを手伝ってくれますか?また、Javaのスレッド環境を使用することから来るTBBについて考えるより良い方法を提案できますか(また、私はTBBに忠誠を誓っていないので、もっと簡単/より良いものがあれば、私は喜んで学びますそれ。積極的に開発されていないように見えるので、私はc ++スレッドプールが好きではありません)?