2011-07-06 6 views
2

私はいくつかのタスクを並行して処理するプロジェクトを扱っています。TPLスレッドがより多くの作業を要求しているかどうかを知る方法?

処理するタスクの数は、一般的に〜200で、そのものは並行することができ、私はそれを制御する方法を提供しますので、それはまた、多くの詳細を簡素化するため、TPLを使用して検討しています約10

ですカスタムTaskSchedulerなどで並行性の程度。

しかし、特定のスレッドがより多くの作業を要求していて、ThreadPoolのキューが空で、他のスレッドから盗む作業がないことを知っている機能を持っていることを知りたい。

これはできますか?

EDIT 1 私は最初は明確ではありませんでした。私はThreadPoolに約50個のタスクをキューに入れることができるたびに、50個のアイテム全体が処理を終えるまで待たずにいます。

+0

この情報で何をしようとしていますか? –

+0

申し訳ありませんが、私は質問が明確になるように編集しました。 – logik6

+0

スケジューリングを自分で行う場合は、なぜスレッドプールを使用しましたか? –

答えて

3

しかし、私はまた、私は、特定のスレッドがより多くの仕事のためとのThreadPoolのキューが空であることを求めていることを知ることができます機能があると便利を見つけようとしていますし、それから盗むために任意のより多くの仕事を持っていません他のスレッド。

残念ながら、ThreadPoolの内部動作は公開されていません。この特定の情報にフックする方法はありません。

スレッドプールは単一の結合単位として機能します。ローカルタスクキューは、新しいスレッドがそのスレッドのローカル作業キューに追加されるため、単一のスレッドプールスレッドが新しいタスクを開始するときにのみ重要です。 「ThreadPoolのキューは空であり、他のスレッドから盗む作業はもうありません」というのは、ThreadPool全体が処理を完了したときにのみ発生します。つまり、作業を追加する場合は、あなたの仕事は終わりです。私が最初にクリアしていなかった

:これは...


編集をチェックするために非常に簡単です。私はThreadPoolに約50個のタスクをキューに入れることができるたびに、50個のアイテム全体が処理を終えるまで待たずにいます。

TPLを使用している場合は、ワークロード全体をキューに入れることができます。カスタムTaskScheduler(またはThreadPoolのプールに依存しているデフォルト)を使用すると、リソースのプールが自動的に行われ、あまりにも多くの作業項目が一度に処理されることを防ぎます。あなたの作業負荷のプロセスが進むにつれ、より多くのアイテムが自動的にスケジュールされます。

2

あなたのタスクごとにTaskを作成してすべて起動するのはなぜですか? TPLは、一度にスレッドプールにスケジュールする数を自動的に決定することになっています(それらはすべて同時に実行されるわけではなく、すべてのリソースを貪欲にします - スレッドプールにいくつかのタスクをスケジュールし、完了したもの)。

関連する問題