このチュートリアルでは、スレッドパーコネクションサーバを作るために5章の内容を 拡張する。この実装は接続してきたクライアントごとに一つのスレッドを割り当てる。 まだ ACE_Reactor を利用するが、これは新規接続を受け付けるのみとする。 Client_Handler オブジェクトはリアクターに関連付けされない。その代わり、 それらは peer() を直接呼ばれることで応答する。
概略:
この章ではストラテジーパターンを利用する。ACE_Acceptor_Base から継承された ACE_Acceptor クラスを利用することで、二つの異なる実装であるシングルスレッドと 接続ごとにスレッドを作成するタイプの両方をまとめて扱うことができる。 また、これは状況に応じて実装を切り替えることができ、それによって将来のサーバの 拡張を可能とする。
この(スレッド部分の実装についての)情報は Client_Handler に(ACE_Acceptor < Client_Hander , ACE_SOCK_ACCEPTOR > の形式を覚えているかい?)渡される。 Client_Hander は Svc_Handler として働く ACE_Svc_Handler の一種であり、 Event_Handler から派生される。そして ACE_Sock_Stream と協調して動く。 その他に(Event_Handlerから)派生されるものとして ACE_Task クラスがある。 これを使って我々はスレッドパーコネクションサーバを作ることができる。
今回はスレッドパーコネクションサーバの各スレッドから呼ばれる svc() メソッドに データ処理も含めてしまうことにする。
ここで、全ての Client_Handler オブジェクトはリアクターに登録されないことを 思い出してほしい。Reactor はクライアントからの接続を受け入れるためだけに 利用される。一旦スレッドが接続に割り当てられたら、Client_Handler オブジェクトは クライアント接続が仕事を始め、その後のイベントに応答することに責任を持つ。
これでマルチスレッドの細かい部分を探求することなく、シンプルなスレッドパー コネクションサーバを作ることができる。