web-dev-qa-db-ja.com

スレッドプールとは何ですか?

スレッドプールをどのように実装しますか?私は「スレッドプール」についてウィキペディアを読んでいますが、この質問を解決するために何をすべきかまだわかりません(おそらく、スレッドプールが何であるかを簡単に理解していなかったためです)。

誰かがスレッドプールとは何か、そしてこの質問にどのように答えるかを平易な英語で私に説明できますか?

66
John Smith

スレッドプールは、事前にインスタンス化されたアイドルスレッドのグループであり、作業を行う準備ができています。これらは、少数の長いタスクではなく、実行する短いタスクが多数ある場合に、各タスクの新しいスレッドをインスタンス化するよりも優先されます。これにより、スレッドを何度も作成するオーバーヘッドを負う必要がなくなります。

実装は環境によって異なりますが、簡単に言うと次のものが必要です。

  • スレッドを作成し、アイドル状態で保持する方法。これは、プールが機能するまで、各スレッドをバリアで待機させることで実現できます。 (これはmutexでも実行できます。)
  • キューなどの作成されたスレッドを格納するコンテナ、またはスレッドをプールに追加して1つをプルする方法を持つその他の構造。
  • スレッドが作業を行うために使用する標準インターフェースまたは抽象クラス。これは、Taskと呼ばれる抽象クラスで、execute()メソッドを使用して処理を行ってから戻る場合があります。

スレッドプールが作成されると、特定の数のスレッドをインスタンス化して使用可能にするか、実装のニーズに応じて必要に応じて新しいスレッドを作成します。

プールにTaskが渡されると、コンテナーからスレッドが取得され(または、コンテナーが空の場合はスレッドが使用可能になるのを待機し)、Taskが渡され、バリアに到達します。これにより、アイドルスレッドは実行を再開し、指定されたTaskexecute()メソッドを呼び出します。実行が完了すると、スレッドは自分自身をプールに戻し、再利用するためにコンテナーに入れてから、バリアーを満たし、サイクルが繰り返されるまで自分自身をスリープ状態にします。

99
Blrfl

スレッドプールは、通常はキューに編成された管理対象スレッドのコレクションであり、タスクキュー内のタスクを実行します。

非同期で何かを実行する必要があるたびに新しいスレッドオブジェクトを作成すると、コストがかかります。スレッドプールでは、非同期に実行するタスクをタスクキューに追加するだけで、対応するタスクに利用可能なスレッドがあれば、スレッドプールが割り当てます。タスクが完了するとすぐに、現在利用可能なスレッドが別のタスクを要求します(残っていると想定)。

スレッドプールは、実際に必要となるよりも多くのスレッドを作成または破棄しないようにするのに役立ちます。

まず、スレッドのキューとタスクのキューを持つクラスを作成します。次に、タスクをタスクキューに追加し、そこから先に進むメソッドを実装します。もちろん、スレッドプールで許可される最大スレッド数を設定できるようにする必要もあります。

10
Dante

実際の例;

  1. 施設:オペレーティングシステム
  2. セクション:アプリケーション
  3. 人々:スレッド

12人が働いている施設があります。この施設には3つのセクションがあります。キッチン、トイレ、セキュリティ。スレッドプールテクニックを使用しない場合の動作は次のとおりです。12人全員が会議室に立って、施設から新しい顧客が来てタスクを要求すると、グループに分けられて、彼らを派遣して仕事をします。 、会議室に戻ります。しかし、彼らが任務に入る前に、準備段階があります。彼らは正しいユニフォームを着用し、特定のデバイスを装備し、そのセクションに歩いて行き、仕事を終えて戻ってくる必要があります。そのため、仕事を終えるたびに(スレッドが終了)、会議室に戻り、制服を脱ぎ、装備を取り出し、次の仕事を待つ必要があります。これらは、スレッドコンテキストの作成を指し、メモリ割り当てとOSによる追跡情報です。 OSが新しいスレッドのニーズを再編成するには時間がかかりすぎます。

スレッドプールを使用している場合は、早朝に6人をキッチンに、2人をトイレに、4人をセキュリティに割り当てます。したがって、彼らは1日1回だけ準備を行います。キッチンに顧客がいない場合でも、これらの4人はアイドリングで次のタスクに参加します。キッチンが閉じる(アプリが終了する)まで会議室に戻る必要はありません。これらの4人はキッチンアプリプールにあり、すぐにサービスを提供する準備ができています。しかし、キッチンが時々アイドル状態になる可能性があるので、あなたが彼らが一日中働いていると約束することはできません。トイレとセキュリティにも同じロジックが適用されます。

最初のシナリオでは、どのタスクのスレッドも無駄にしませんが、各タスクのすべての単一スレッドを準備するにはかなりの時間がかかります。 2つ目は、事前にスレッドを準備するため、すべてのタスクですべてのスレッドを使用することを保証することはできませんが、ほとんどの場合、OSは優れた最適化を行うため、安全に信頼できます。

2
Teoman shipahi

マルチスレッドアプリケーションでは、スレッドプールは、アプリケーションで使用できる「使用可能なスレッドのプール」です。通常、例えば.NET、それはすべて管理されているので、タスクを割り当てるだけで、スレッドが解放されると、それが実行されます。したがって、スレッドプールを実装するには、タスクごとに明示的なスレッドを作成せずに、タスクが空きスレッドによって自動的に実行されるという概念を作成することを期待しています。

1
PTS