18

複数のコア用に最適化する必要があるアプリケーションを C# で作成しました。私はいくつかのスレッドを持っています。もっとやるべきですか?

詳細を更新しました

  • C#2.0
  • Windows Vista および Windows Server 2003 で実行

再更新

  • このコードはサービスとして実行されています
  • 完全なコードは必要ありません...ここでの私の目標は、あなたの経験と開始方法を取得することです。私が言うように、私はすでにスレッドを使用しています。これ以上何ができますか?
4

6 に答える 6

48

高度に最適化されたマルチスレッド プロセスを作成することは、いくつかのスレッドを混在させるよりもはるかに難しいことを一般化します。

次の手順から始めることをお勧めします。

  1. ワークロードを個別の並列実行可能ユニットに分割します
  2. ネットワーク集中型、I/O集中型、CPU集中型などのワークロード タイプを測定して特徴付けます。これらは、ワーカー プーリング戦略の基礎となります。たとえば、ネットワークを集中的に使用するアプリケーションにはかなり大きなワーカー プールを使用できますが、CPU を集中的に使用するタスクにはハードウェア スレッドよりも多くのワーカーを使用しても意味がありません。
  3. スレッドのプールを管理するには、キューイング/配列または ThreadWorkerPool について考えてください。前者は後者よりもきめ細かく制御されています。
  4. 可能であれば、同期パターンよりも非同期 I/O パターンを優先することを学びます - 他のタスクを実行するためにより多くの CPU 時間を解放します。
  5. ディスクなどの競合するリソースのシリアライゼーションをなくすか、少なくとも減らすように取り組みます。
  6. I/O を最小限に抑え、最小限の期間、最小限のレベルのロックを取得して保持します。(リーダー/ライター ロックはあなたの味方です)
    5. そのコードをくまなく調べて、リソースが一貫した順序でロックされていることを確認し、致命的な抱擁を最小限に抑えます。
  7. 狂ったようにテストしてください。マルチスレッド アプリケーションの競合状態やバグをトラブルシューティングするのは地獄です。多くの場合、大虐殺の法医学的な余波しか見られません。

マルチスレッド バージョンは、同じアプリのシングルスレッド バージョンよりもパフォーマンスが低下する可能性があることに注意してください。優れた工学的測定に言い訳はありません。

于 2008-09-23T21:06:30.470 に答える
8

Herb Sutter のコラム「Effective Concurrency」を読むとよいでしょう。これらの記事は、他の記事とともにここにあります。

于 2008-09-23T21:06:28.647 に答える
8

.NET の並列拡張機能を確認することをお勧めします。

http://msdn.com/concurrency

于 2008-09-23T20:57:22.410 に答える
6

複数のコアをより効率的に利用できるようにするには、作業を並列実行できる部分に分割し、スレッドを使用して作業をコアに分割する必要があります。スレッド、バックグラウンド ワーカー、スレッド プールなどを使用できます。

于 2008-09-23T20:58:40.113 に答える
5

C# の場合は、LINQ のやり方を学び始めてから、Parallel LINQライブラリとその .AsParallel() 拡張機能を利用します。

于 2008-09-23T20:56:55.797 に答える
2

解決しようとしている問題の並列処理(または並列処理の可能性)を理解することは、スレッドの同期やライブラリなどの詳細よりも、アプリケーションとそのアルゴリズムの方がはるかに重要です。

並列プログラミングのパターン(「並行性の発見」とより高いレベルの設計の問題に焦点を当てています)を読むことから始め、次にマルチプロセッサープログラミングの芸術(理論的基礎から始まる実用的な詳細)に進みます。

于 2008-09-23T21:09:58.090 に答える