3

私はマルチスレッドが初めてで、アプリケーションの領域を並列化することに取り組んでいます。私はこのサイトで多くの投稿を読みましたが、私の問題に取り組む最善の方法についてまだ混乱しています:

[1] .NET 3.5 ではThreadPool、プログラムがマシンのマルチコアを活用する唯一の方法はありますか? つまり、を使用して異なるコアでスレッドを生成することは可能new Thread()ですか?

[2] 私の場合:List<Calculation>約 80 個のアイテムが含まれており、現在順次処理されています。したがって、私が.NET 3.5を使用していて、私が読んだことに基づいていることを考えるとThreadPool、スレッド数が多いため、おそらくマルチスレッドの最善の策です。

  • 計算の間には多くの依存関係があります。現在、リストは、必要なすべての計算が最初に実行されるように並べられています。

これは、作業項目の依存関係がどのように見えるかです (詳細は重要ではなく、依存関係の複雑さを指摘したかっただけです):

代替テキスト

  • 計算時間は大きく異なります.1つのCalculationオブジェクトは値の取得のみを伴う場合があり、他のCalculationオブジェクトはネストされたループで多くの作業を伴う場合があります...など

Calculationsそれに依存する10以上の他の作業項目のようなものを持つメインに優先順位を付けるにはどうすればよいですか? 使用するシグナリングの最も効率的な方法は何ですか?

ありがとうございました。

List<Calculation>編集:修正されたままであることを言及する必要があります。ただし、80回以上の計算を計算すると、x百万回と呼ばれます。イテレータが更新されるたびCalculationに、リスト内のすべてで Calculate() が呼び出されます。

4

4 に答える 4

2

[1]: はい。 を使用して異なるコアでスレッドを生成することは可能new Thread()ですが、スレッドプールを使用したほうがよい場合もあります。相違点については、次で説明します。

スレッドとスレッドプール

于 2010-11-04T18:07:49.183 に答える
2

これは、.Net 4.0 でTask Parallel Libraryを使用すると非常に簡単になります。

いつアップグレードする予定ですか? 必要なすべての調整コードを自分で書くよりも早いかもしれません。

このブルート フォースを実行する必要がある場合は、Thread.BeginThreadAffinityを使用して、含まれているコードが単一の CPU で実行されるようにすることができます。これは、計算パフォーマンスに役立ちます。

于 2010-11-04T18:07:59.077 に答える
1

[1] .NET 3.5 では、プログラムがマシンのマルチコアを活用する唯一の方法は ThreadPool ですか? つまり、 new Thread() を使用して異なるコアでスレッドを生成することは可能ですか?

スレッドを実行するコアを決定するのは、オペレーティング システム次第です。OS はデフォルトで複数のコアにスレッドを均等に分散します (少なくとも Windows では)。

ThreadPoolThread実際には1種類しかないため、クラスと同じ種類のスレッドを使用しています(ただし、それらをラップするクラスとアルゴリズムの種類は異なります)

[2] 私の場合: 現在順番に処理されている、約 80 個の項目を含む List があります。したがって、私が .NET 3.5 を使用していて、私が読んだ内容に基づいていることを考えると、ThreadPool は、スレッド数が多いため、おそらくマルチスレッドに最適な方法です。ただし、次のようになります。

を使用ThreadPool.QueueWorkItemするのが、アプリケーションを変換する最も簡単な方法のようです。

100 個の異なるスレッドを実行しても、アプリケーションが 10 個のスレッドを実行するよりも 10 倍高速になるわけではないことに注意してください。.net と OS がスレッド間で切り替わったときにバックグラウンドで問題が発生した場合、10 個のスレッドが非常に高速に実行される可能性が高くなります。

  1. をに変換ListしますQueue
  2. 計算を開始するときは、ThreadPool.QueueWorkerItem(MyMethod); に 10 (または任意の数) の呼び出しを追加します。
  3. MyMethod で、ジョブがなくなるまでキューからアイテムを取り出し続けるループを作成します。
于 2010-11-04T18:20:40.607 に答える
0

コメントで述べたように、PLINQはこれを非常に簡単にします。

List<Calculation> foo = ...;
foo.AsParallel.Select(c => c.Calculate());
于 2010-11-04T18:09:11.087 に答える