2009-07-27 10 views
5

Thread-pool(pthreadsの助けを借りたC言語)を実装するコンセプトは何ですか? スレッドプールから実行するスレッドをどのように割り当てることができますか?スレッドプールとは何ですか?

答えて

9

スレッドプールは、アプリケーションの起動時に作成される固定数のスレッドの集合です。スレッドは、通常、セマフォによって制御されるキューを介して要求が来るのを待って待機します。要求が行われ、少なくとも1つのスレッドが待機している場合、そのスレッドは起動され、要求を処理し、セマフォの待機に戻ります。使用可能なスレッドがない場合、要求は1つになるまでキューに入れられます。

スレッドプールは、すべての要求に対して新しいスレッドを単に開始するよりも、リソースをより効率的に管理する方法です。ただし、アーキテクチャによっては、要求のロードに応じて、アプリケーションの実行時に新しいスレッドを作成してプールに追加することができます。

2

anonの回答に追加するスレッドの固定数が固定されている固定スレッドプールがあります。キャッシュされたスレッドプールは、作業が利用できないときに動的に拡大して縮小することができます。動的スレッドプールは、スレッドの最大数および/または作業キューの最大長によってバインドすることもできます。私は実際にはこの種のもののための専門用語が設定されているとは思わないが、Cで書かれた非固定TPに遭遇することはほとんどありませんが、固定TPがそこにある唯一の種類ではないことを少なくとも知っているはずです。前回の回答で何かを明確にするために

3

:より多くのスレッドをインスタンス化することは非効率につながること

理由は、時間を切り替えコンテキストです。 OSはプロセッサ上で別のスレッドを定期的に切り替える。これには、あるスレッドの状態を保存し、メモリから別のスレッドの状態をロードすることが含まれるため、コンテキストスイッチごとに無視できない時間(N ms)がかかります。

たとえば、10スレッドの場合、コンテキスト切り替えは10 * N msです。 1000スレッドの場合、1000 * N msです。同時スレッドの数が増加すると、最終的にコンテキストの切り替えがマルチスレッドから得られる効率を圧倒し始めます。あなたのアプリケーションは、最良のスレッド数の点でスイートスポットを持っています。実験でこのスイートナンバーを決定したら、スレッドプールの最大サイズをそのスレッド数に設定して、マルチスレッド化から最大の効率を得ることができます。

+0

コンテキストスイッチに1ミリ秒かかることはほとんどありません。一般的には、これらは私たちのラインに沿っています。他のすべては非常に素晴らしいです。 – CrazyCasta

+0

Nは整数で、誰が> = 1であると言ったのですか? – Blah0x7B9

+0

単位msを使用すると、時間はmsのオーダになることが示唆されます。私はあなたの答えを読んでいるほとんどの人が文脈の切り替えの時間が1周ぐらいだとは思わないと信じています。 – CrazyCasta

関連する問題