システムプログラミング 演習8:スレッドプール

2011年11月14日

スレッドプール

本演習では,マルチスレッドのネットワークサーバでは必須となるスレッドプー ルの作成を行う.

ネットワークサーバにおいて,接続クライアントごとにスレッドを生成してし まうと,同時接続クライアント数に従いスレッド数が増えてしまい,資源の枯 渇を起こす可能性がある.また,資源の枯渇が起きないまでも,多くのスレッ ド生成,終了処理が行われるためオーバヘッドが大きくなる.この問題を解決 する方法にスレッドプールがある.

スレッドプールは,固定数のスレッドの集合であり,スレッド生成のリクエス トに対して,仕事をしていないスレッドが対応する.スレッドプールの全ての スレッドが仕事中であれば,どれかのスレッドが終了するまでそのリクエスト は待たされることになる.

スレッドプールを実現するためには,まず,スレッド生成のリクエストを保持 するためのキュー,あるいは巡回バッファが必要となる.スレッド生成のリク エストを保持するためには,pthread_createの引数で分かるとおり,関数ポイ ンタと引数のポインタを保持すればよい.

次は,スレッド生成のリクエストを保持するキュー,あるいは巡回バッファに 保持されているリクエストを実行するワーカスレッドを,スレッドプールに必 要な数起動する.ワーカスレッドは,リクエストを取得し,取得できれば実行, そうでなければ取得できるまで待つ,という動作を繰り返せばよい.

[演習8-1]
スレッド生成のリクエストを保持するためのスレッドセーフなキュー, あるいは巡回バッファを作成しなさい.
[演習8-2]
演習8-1で作成したキューあるいは巡回バッファからリクエストを取得し, 取得できればそのリクエストを実行,取得できなければ取得できるまで待 つようなワーカスレッドを作成しなさい.
[演習8-3]
演習7で作成したネットワークサーバを,上記で作成したスレッドプール を利用するようにしなさい.ワーカスレッドを3つ立ち上げ,5クライアン トから同時に接続することにより動作の確認を行いなさい.

提出締切は 11/20(日) 20:00とする.
レポートには,プログラム,実行結果,考察,授業の感想を必ず含めること.
課題は筑波大学 e-Lerning システム にアップロードすること.


Osamu Tatebe