2011-01-11 13 views
0

バックグラウンドワーカーを使用してクアッドコアコンピュータを最適に活用する方法を理解しようとしています。特に、複数のコアで動作するように指定する必要がありますか、CRLが異なるコア間でスレッドを自動的に委譲しますか?また、BGWの複数のインスタンスを実行することも可能です(私は既に無限ループを実行し、オブジェクトをメインスレッドに戻しますが、ほかのコアも同様に利用することをお勧めします)。クアッドコアを使用したマルチスレッド/バックグラウンドワーカー(C#)

私のプロジェクトは少し違っていると思うのは、非常に込み入った(それは並列プログラミングを使って作業を分割する必要がある)1つか2つのタスクではないということです。データを引き出すための非常に長いループと計算を常に実行する必要があります...

すべての考えが大いに評価されるでしょう!

いいえお返事

答えて

1

Windowsスレッドスケジューラは、すぐに実行できるスレッドをコアに分散して配布します。それは完全に自動です。

3

ループを並列化するには、.NET 4.0のParallel.ForまたはParallel.Invoke(機能に応じて)の機能を非常に効果的に使用できます。私の経験では、Parallel.Invokeは最速の方法です手動でバックグラウンドワーカースレッドを作成するよりも高速です)。

1

ランタイムライブラリは「適切なことを行います」(ほとんど)。これにより、保有しているコアの数が決定され、それに応じてワークロードのバランスをとることが試みられます。

あなたのプロジェクトはすべてではありません。ちなみに、それはです。私たちが見る並列プログラミングの例の多くは、単一のタスクを実行して複数のコアを処理できるように分割する必要があるようですが、あなたが話しているような種類のアプリケーションがたくさんあります。たとえば、複数のスレッドをパイプライン形式で実行する複数のアプリケーションがあります。 1つのスレッドは、入力キュー(ファイルからの読み取り、データの解凍とレコードのキューへの配置)、出力キュー(出力からのレコードの取り出し、圧縮、ディスクへの書き込み)を行います。入力キューから読み取り、レコードを処理し、出力キューに書き込むことができます。ここでの制限要因は、ディスクへの圧縮と書き込みの速度です。

ドキュメントでは通常短いタスクではBackgroundWorkerを使用することを推奨していますが、スレッドプールを使い果たしていない限り、そのようなアプリケーションでうまく動作します。長期実行スレッドを必要とし、スレッドプールを多く使用する必要がある場合は、長時間実行するタスクに独自のプール以外のスレッド(System.Threading.Threadクラスを使用)を作成することを検討する必要があります。

関連する問題