web-dev-qa-db-ja.com

最適なスレッドキューの例/ベストプラクティス

特定のバックグラウンドスレッドで実行する必要があるデータがあります。これを呼び出す必要がある他のすべてのスレッドからのコードがあります。このスレッド化の要件をサポートするために、同期用のキューを作成するための優れたチュートリアルまたはベストプラクティスがありますか?

34
leora

次のいずれかが可能です。

9
VonC

C#のスレッド化 、Joseph Albahariによる、マルチスレッド化に関する非常に完全なリファレンスをご覧ください。特に、彼は プロデューサー/コンシューマーキュー をカバーしています。

33

これはThreadPoolsに関する興味深い記事です。

http://www.codeproject.com/KB/threads/smartthreadpool.aspx

より簡単なユースケースでは、.Net独自のThreadPoolクラスも使用できます。

5
Dirk Vollmar

この問題に対する私のお気に入りの解決策の1つは、_producer/consumer_パターンに似ています。

ブロッキングキューオブジェクトを保持するマスタースレッド(ほとんど私のプログラムのMain())を作成します。

このマスタースレッドは、いくつかのワーカースレッドをスピンオフします。ワーカースレッドは、中央のブロッキングスレッドから単純にポップして処理します。スレッドセーフなブロックキューなので、同期ビットは簡単です。プロデューサー/メインスレッドによってタスクがキューに登録されるまで、TaskQueue.Dequeue()呼び出しはブロックされます。

必要なワーカーの数を動的に管理したり、構成変数に従って修正したりできます。すべてのワーカーがキューからポップするだけなので、ワーカーの数によって複雑さが増すことはありません。

私の場合、いくつかの異なるタイプのtasksを処理するサービスがあります。 TaskQueueTaskのような一般的なものを処理するために入力されたキューがあります。次に、それをサブクラス化し、Execute()メソッドをオーバーライドします。


また、非常に簡単にプールに物を投げることができる.NETスレッドプールアプローチも試しました。使い方は非常に簡単でしたが、制御がほとんどなく、実行順序やタイミングなどの保証もありませんでした。軽量タスクにのみお勧めします。

1
Michael Haren

この解決策を試すことができます。生産者と消費者のパターンを実装する方法を示します。それで何ができるかについての説明もあります。生産者と消費者の数の異なる組み合わせのように。

http://devpinoy.org/blogs/jakelite/archive/2009/01/12/threading-patterns-the-producer-consumer-pattern.aspx

http://devpinoy.org/blogs/jakelite/archive/2009/02/03/threading-patterns-producer-consumer-pattern-examples.aspx

0
jake.stateresa