0

私はPOSIX互換システムとWindows(R)の両方のためにC ++でプログラムを開発していて、疑問に思っていました。

  1. 最高のOSポータブルスレッドプールライブラリは何ですか?それとも私は自分で作る必要がありますか?
  2. 物理プロセッサコアよりも多くのトレッドをプールするポイントはありますか?
4

5 に答える 5

4
  1. 新しいC++11標準はスレッド化をサポートしているため、コンパイラーがそれをサポートしている場合は、それを優先する必要があります。それ以外の場合は、Boost.Threadがあります。これらはスレッドプールライブラリではありませんが、それらの上にスレッドプールを構築できます。
  2. 解決しようとしている問題によって異なります。n個のタスクを並列で実行する場合は、プロセッサコアの数に関係なく、 n個のスレッドを開始する必要があります(プロセッサが複数のコアを拡張する前はマルチスレッドが一般的であり、通常は数百のスレッドがすでに並列で実行されているため、さらにいくつかそれほど重要ではありません)。一方、スレッドの作成にはコストがかかるため、短命のバックグラウンドスレッドごとに新しいスレッドを作成しないでください。C ++ 11では、このようなバックグラウンドタスクにfuturesを使用できます。
于 2012-04-14T14:32:30.560 に答える
1
  1. 可能であれば、スレッドを抽象化するライブラリを使用し、代わりにIntel TBB /MicrosoftPPLなどのタスクに集中するのが最善です。parallel_forまた、使いやすく強力な並列アルゴリズムも提供します。さらに、操作の削減、再帰的なものなど、他のさまざまな問題の負荷を解決する可能性を提供します...

  2. 一般に、スレッド間の過度のタスク切り替えとスレッドのスプワンはパフォーマンスを低下させる可能性があるため、これは適切ではありません。代わりに、タスクを盗むパターンを適用して、異なるスレッドで作業を分割することを試してみてください(TBBとPPLが実行します)(TBB wikiページを参照)。小さなオーバーサブスクリプションが適切な唯一の場所は、一部のスレッドが待機する必要があり、CPU処理時間を浪費する場合です。

于 2012-04-14T14:39:58.130 に答える
1

1)私もBoostを使います。

2)たぶん。タスクにロックまたはI/Oブロッキングがある場合は、多数のスレッドが必要になる可能性があります。タスクがCPUにバインドされている場合、言うのはより困難です。タスクが大量のデータを読み取らず、特に書き込みを行わず、実行時にそれほど多くのキャッシュを無効にしない場合、スレッドの数が多いと、実際にはパフォーマンスがわずかに向上するようです。変数に追加するだけで、200スレッドが取得されます。大量のメモリを使用し、すべてのキャッシュをダーティにする傾向があるCPUバウンドタスクのより一般的なケースでは、多くのスレッド(たとえば、200)により、通常、スループットが20低下します。 -キャッシュフラッシュのために-50%。

于 2012-04-14T14:49:33.907 に答える
1

dlibにはスレッドプールツールがあり、マシン上の処理コアの数を指定して、スレッドプールにジョブを送信できます。したがって、マルチコアCPUを効果的に使用しやすくするための何かを探している場合は、dlib::thread_poolが非常に便利です。

C++11ラムダ関数を含むさまざまなメソッドを使用してプールにジョブを送信するなどの方法を示すサンプルプログラムもあります。もう1つの優れた点は、インストールプロセスがないことです。このサンプルプログラムをダウンロードして、コンパイルするだけです。何もインストールまたは構成する必要はありません。あなたが言及したプラットフォームのいずれかで動作します。

于 2012-04-14T15:12:48.123 に答える
-2

Boostスレッドはクロスプラットフォームであり、C ++用です:http ://www.boost.org/doc/libs/1_49_0/doc/html/thread.html

于 2012-04-14T14:32:12.513 に答える