スレッドプールを実行する任意のタスクの異なる優先順位
-
09-06-2019 - |
質問
ようにしているデザインのためのスレッドプレミアムケーブルチャンネルの設計要件のための私の仕事です。これは現実問題として働くソフトウェアすべきと思うかもしれないが、誰も成功していなかった。していな実装してしまいましたが、まず私を捨てるとのことで、面白いアイデア人ができるよう、比較的自実装していませんのでご注意くださ架ます。って特定の要件としています。
スレッドプールのニーズを実行するシリーズです。の作業できる短いランニング(<設定1sec)または長時間または日)。各タスクに関連する優先度(1=非常に低い5=いています。課題で到着時に他の作業は、その到着のスレッドプールズ題とスケジュールとしてのスレッドが可能になりました。
タスクの優先度が完全に独立、タスクの長さです。実はそのことは不可能でどれだけ長いタスクが実行せず、ただの走ります。
一部のタスクがCPUに行きつきIOれます。断言はでき合う、つまり与えられた課題に対してもあいまっていく可能性も否定できな検出を務めた。
の主要目的は、スレッドプールを最大限に高めーザーにとって大きな魅力です。スレッドプールのあの有効活用資源のです。理想的には、CPU行業務のアクティブスレッドが同数のCpuを搭載しています。のためのIO行業務をよりスレッドな配分によりCpuによるブロックせずに過度に影響ーザーにとって大きな魅力です。を最小限のロック用スレッドに対して安全/高速容器が重要になります。
一般に、実行優先度の高いタスクが高いCPUを優先(ref:SetThreadPriority).下の優先課題は"ブロック"優先度の高いタスクを実行ではないので、優先度の高い作業がなすべての優先度の低いタスクを起動したあとは、優先度の高いタスクを取得します。
の課題について最大走行タスクパラメータを生活の場としていました。各タイプのタスクは実行時にこの変数を有効にしても同時インスタンスの課題です。例えば、当ウェブサイトにて以下のタスクのキュー:
- A-1000インスタンス-低優先度-最大の課題1
- B-1000インスタンス-低優先度-最大の課題1
- C-1000インスタンス-低優先度-最大の課題1
実装が実行(最大)1A、1B1Cでも同時に行います。
このニーズにWindows XP,Server2003,VistaとServer2008の最新サービスパック).
参考として使用する場合は、以下のインターフェース
namespace ThreadPool
{
class Task
{
public:
Task();
void run();
};
class ThreadPool
{
public:
ThreadPool();
~ThreadPool();
void run(Task *inst);
void stop();
};
}
解決
なので私たちは何を迎えてのブロックされます。Windowsには二つのビルブロックが有望:I/Oポート終了(IOCPs)と非同期の手順電話(APCs).これらをFIFOキュなることを明示的にロックし、一定量のサポートOSのスケジューラー(例えば、IOCPsいるため一部のコスイッチ).
APCsこれらの結果からは少しよりフィットして少し注意しない"透明".がある場合、項目を実行alertable wait(::SleepEx,::WaitForXxxObjectEx等) して偶発的に派遣し、APCのスレッドを新たに派遣されAPCコネクタ付きのスレッドを停止する以前に実行APCまでのAPCは終了しました。ここにはトレードオフが存在しますが当社の並行処理の要件とができるスタックが溢れる可能性が高い。
他のヒント
このニーズにWindows XP,Server2003,VistaとServer2008の最新サービスパック).
う機能のシステムのスレッドプールして適しなおす。したい場合は対象XP、2003年には使用できませんの新しい光沢のあるVista/2008のプールでもそのままお使いいただけQueueUserWorkItemます。
@DrPizza-この非常に良い質問ですが、攻撃の心の問題です。ある理由QueueUserWorkItem、Windows NTのスレッドプールがあるエリアになかを見て興味深いかかる。
まず、皆さんもすでにご存知だと思うが大きい時の起動、停止す。聞いていましたので、NTスレッドプールになれる新しいスレッドの場合になると考えてい作業が短います。このWT_EXECUTELONGFUNCTIONが、私たちは考えがないタスクの場合には、長期間の短
次に、あなたのスレッドプールで埋め尽くされるくらい長、優先度の低い課題が存在しなかったら、どうなので、優先度高のタスクを実行でタイムリーに行います。NTスレッドプールな考えて成長するプログラムタスクの優先事項できませんQueueUserWorkItemというと"あ、ち、この権利化できます。
第三に、よMSDN)、NTスレッドプールには対応していないの駅アパートモデルです。なんなのかっこうだが、すべての労働者のスレッドが実行中です。
@DrPizza-この非常に良い質問ですが、攻撃の心の問題です。ある理由QueueUserWorkItem、Windows NTのスレッドプールがあるエリアになかを見て興味深いかかる。
ええ、そうでないことも私たちにVista、非常に汎用性の高ます。
OKなのに、まだ少し不明な点などご希望を優先します。場合にはプールは現在実行中のタスクのタイプ、最大限の並行処理の1と低優先で取得した新しいタスクのタイプA(最大の並行処理1)ここでも高い優先に何をすべきなのか?
スの停止は、現在実行しているが毛なりますので注意してください(有ロックの新たな課題のニーズを取りdeadlockingのシステム)することはできな産卵の第二のスレッドだけで走るとともに許可され並行処理1).そのまで待つことはできませんの優先度の低い作業が完了し、ランタイムには限り、そうすることにより、優先度の低いタスクをブロックは、優先度の高い課題です。
私の推測では後者の行動だ。
@DrPizza:
OKなのに、まだ少し不明な方 ご希望の優先事項です。の場合 プールは現在実行中のタスク タイプAの最大の並行処理の 1低優先で取得した 新しいタスクのタイプA(最大 並行処理1)ですが、今回、 高優先度は何をすべきなのか?
その金と銀の使用法がひとき少しトリッキーにはこの場合だと思いをやらせていただきたいと思い付けを可能に優先順位の低いタスクを実行する。通常、いくならないと思いくのと同じ種類のタスクの異なるスレッドの優先順位当社のモデルで実際にできる安全に停止後の再スタータでよく定義されたポイント(なことは、合併症のことを紹介しくない値のリスクです。
通常、異なる種類の事務をは異なる優先順位をもつ。例えば:
- タスク-1000インスタンス-低優先度
- Bタスク-1000インスタンス-優先度の高い
を想定し、業務にたった後、Bタスクが届きにくくなっています。B業務に走行できるようにはしめます。