(57)【特許請求の範囲】
【請求項１】
複数の処理のうちの少なくとも一の処理に対して複数のスレッドのうちの空スレッドを割り当てる管理部と、該管理部によって該空スレッドが割り当てられた該一の処理を実行する処理部と、をそなえ、
該処理部は、
該複数の処理のうちの第１の処理から、該複数の処理のうちのレスポンスに関する処理を実行する第２の処理を識別するための識別情報を付加したリクエストを送信し、
該管理部は、
該処理部によって、該第１の処理から該リクエストが送信された場合に、該第１の処理に割り当てられたスレッドを解放して空スレッドにするとともに、該第１の処理を終了させ、
該処理部によって、該リクエストに対するレスポンスであって該リクエストに付加された該識別情報を該リクエストの送信先により付加された該レスポンスが受信されると、該処理部が受信した該レスポンスに付加された該識別情報に基づいて、該第２の処理に対して空スレッドを割り当て、
該識別情報は、該第２の処理を実行するオブジェクトを生成する関数の関数ポインタであることを特徴とする、マルチスレッド処理装置。
【請求項２】
複数の処理のうちの少なくとも一の処理に対して複数のスレッドのうちの空スレッドを割り当てる管理部と、該管理部によって該空スレッドが割り当てられた該一の処理を実行する処理部と、をそなえ、
該処理部は、
該複数の処理のうちの第１の処理から、該複数の処理のうちのレスポンスに関する処理を実行する第２の処理を識別するための識別情報を付加したリクエストを送信し、
該管理部は、
該処理部によって、該第１の処理から該リクエストが送信された場合に、該第１の処理に割り当てられたスレッドを解放して空スレッドにするとともに、該第１の処理を終了させ、
該処理部によって、該リクエストに対するレスポンスであって該リクエストに付加された該識別情報を該リクエストの送信先により付加された該レスポンスが受信されると、該処理部が受信した該レスポンスに付加された該識別情報に基づいて、該第２の処理に対して空スレッドを割り当て、
該識別情報は、該第２の処理を実行するオブジェクトの先頭アドレスであることを特徴とする、マルチスレッド処理装置。
【請求項３】
記憶部をさらにそなえ、
該管理部は、
複数のオブジェクトのうちの第１及び第２のオブジェクトを該記憶部にそれぞれ生成し、生成した該第１及び第２のオブジェクトの少なくとも一のオブジェクトに対して複数のスレッドのうちの空スレッドを割り当て、
該処理部は、
該管理部によって該空スレッドが割り当てられた該第１又は第２のオブジェクトに含まれる処理を実行し、
該管理部は、
生成した該第１のオブジェクトに対して空スレッドを割り当て、
該処理部によって、該第１のオブジェクトで実行される該第１の処理からリクエストが送信された場合に、該第１のオブジェクトに割り当てられたスレッドを解放して空スレッドにするとともに、該第１のオブジェクトを該記憶部から削除し、
該処理部によって、該リクエストに対するレスポンスが受信されると、該第２の処理を実行する該第２のオブジェクトに対して空スレッドを割り当てることを特徴とする、請求項１又は請求項２記載のマルチスレッド処理装置。
【請求項４】
該処理部が、該リクエストを送信する前に、
該管理部は、受信待ちスレッドとして、該リクエストに対する該レスポンスを受信する処理を該空スレッドに割り当てるとともに、
該処理部は、該受信待ちスレッドにより該レスポンスを受信する処理を開始することを特徴とする、請求項１〜３のいずれか１項記載のマルチスレッド処理装置。
【請求項５】
請求項１〜４のいずれか１項記載のマルチスレッド処理装置と、該マルチスレッド処理装置と相互に通信可能に接続された他の装置と、をそなえるマルチスレッド処理システムであって、
該処理部は、該他の装置に対して該リクエストを送信し、
該他の装置は、該処理部から受信した該リクエストに対する該レスポンスを、該マルチスレッド処理装置に対して送信することを特徴とする、マルチスレッド処理システム。
【請求項６】
複数の処理のうちの少なくとも一の処理に対して複数のスレッドのうちの空スレッドを割り当てる管理部、および、該管理部によって該空スレッドが割り当てられた該一の処理を実行する処理部、として、コンピュータを機能させるマルチスレッド処理プログラムであって、
該処理部は、
該複数の処理のうちの第１の処理から、該複数の処理のうちのレスポンスに関する処理を実行する第２の処理を識別するための識別情報を付加したリクエストを送信し、
該管理部は、
該処理部によって、該第１の処理から該リクエストが送信された場合に、該第１の処理に割り当てられたスレッドを解放して空スレッドにするとともに、該第１の処理を終了させ、
該処理部によって、該リクエストに対するレスポンスであって該リクエストに付加された該識別情報を該リクエストの送信先により付加された該レスポンスが受信されると、該処理部が受信した該レスポンスに付加された該識別情報に基づいて、該第２の処理に対して空スレッドを割り当てるように、
該コンピュータを機能させ、
該識別情報は、該第２の処理を実行するオブジェクトを生成する関数の関数ポインタであることを特徴とする、マルチスレッド処理プログラム。
【請求項７】
複数の処理のうちの少なくとも一の処理に対して複数のスレッドのうちの空スレッドを割り当てて、該空スレッドが割り当てられた該一の処理を実行するマルチスレッド処理方法であって、
該複数の処理のうちの第１の処理から、該複数の処理のうちのレスポンスに関する処理を実行する第２の処理を識別するための識別情報を付加したリクエストを送信し、
該第１の処理から該リクエストが送信された場合に、該第１の処理に割り当てられたスレッドを解放して空スレッドにするとともに、該第１の処理を終了させ、
該リクエストに対するレスポンスであって該リクエストに付加された該識別情報を該リクエストの送信先により付加された該レスポンスが受信されると、該レスポンスに付加された該識別情報に基づいて、該第２の処理に対して空スレッドを割り当て、
該識別情報は、該第２の処理を実行するオブジェクトを生成する関数の関数ポインタであることを特徴とする、マルチスレッド処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本件は、マルチスレッド処理を行なうマルチスレッド処理装置，マルチスレッド処理システム，マルチスレッド処理プログラム，及びマルチスレッド処理方法に関する。
【背景技術】
【０００２】
現在、一般的に用いられているクライアント・サーバ方式の通信では、サーバ端末上のプログラムは、クライアント端末上のプログラムから送信されるデータの提供等の要求（リクエスト）に対して、所定の処理を実行し、応答（レスポンス）を返信する。これにより、クライアント端末上のプログラムは、サーバ端末上のプログラムから受信するレスポンスの内容に基づいて、リクエストに係る処理を継続することができる。【０００３】
図８は、一般的なクライアント・サーバ間通信を行なうシステム１００の構成例を示す図である。
クライアント端末２００及びサーバ端末３００は、ネットワーク２５０を介して相互に通信可能に接続されており、クライアント端末２００からサーバ端末３００へのリクエストに対して、サーバ端末３００がクライアント端末２００へレスポンスを返信する。【０００４】
クライアント端末２００は、マルチスレッド処理を実行することが可能であり、当該処理を実行するＣＰＵ（Central Processing Unit）２１０，記憶部２２０及び送受信部２３０をそなえる。
ＣＰＵ２１０は、記憶部２２０に格納されたプログラムを読み出して、所定のマルチスレッド処理を行なう。【０００５】
記憶部２２０は、種々のデータやプログラムを格納する記憶領域をそなえ、ＣＰＵ２１０がプログラムを実行する際に、当該記憶領域に格納されたプログラムを読み出したり、データやプログラムを当該記憶領域に格納・展開して用いられる。
ここで、記憶部２２０は、図９を用いて後述する、オブジェクトを用いるマルチスレッドプログラムであるクライアントプログラム４００を格納し、ＣＰＵ２１０によって、クライアントプログラム４００が読み出され、マルチスレッド処理が実行される。【０００６】
また、サーバ端末３００は、ＣＰＵ３１０，記憶部３２０及び送受信部３３０をそなえる。
ＣＰＵ３１０は、記憶部３２０に格納されたプログラムを読み出して、所定の処理を行なう。
記憶部３２０は、記憶部２２０と同様に、種々のデータやプログラムを格納する記憶領域をそなえる。【０００７】
ここで、記憶部３２０は、図９を用いて後述するサーバプログラム５００を格納し、ＣＰＵ３１０によって、サーバ端末３００における処理が実行される。
送受信部２３０及び３３０は、それぞれ、クライアント端末２００及びサーバ端末３００間で双方向にデータを送受信する。
送受信部２３０は、サーバ端末３００に対してＣＰＵ２１０からのリクエストを送信するとともに、サーバ端末３００からのレスポンスを受信してＣＰＵ２１０に受け渡す。【０００８】
また、送受信部３３０は、クライアント端末２００からのリクエストを受信してＣＰＵ３１０に受け渡すとともに、クライアント端末２００に対してＣＰＵ３１０からのレスポンスを送信する。
図９は、クライアントプログラム４００及びサーバプログラム５００の構成例を示す図である。【０００９】
クライアントプログラム４００は、マルチスレッドＯＳ配下で動作するプログラムであり、上述のように、クライアント端末２００の記憶部２２０に格納され、ＣＰＵ２１０によって記憶部２２０から読み込まれることによって実行される。
クライアントプログラム４００は、スレッドプール４１０，オブジェクト４３０，及び受信待ちループ処理スレッド４４０をそなえる。【００１０】
スレッドプール４１０は、クライアントプログラム４００による処理において用いられるスレッドを格納するものであり、クライアントプログラム４００によって生成される。また、クライアントプログラム４００は、スレッドプール４１０の生成過程において、所定の数（ここでは３つ）のスレッド４２０−１〜４２０−３を生成する。
以下、スレッドを示す符号としては、複数のスレッドのうちの１つを特定する必要があるときには符号４２０−１〜４２０−３を用いるが、任意のスレッドを指すときには符号４２０を用いる。【００１１】
オブジェクト４３０は、クライアント処理，レスポンス受信処理及びレスポンス処理を持つオブジェクトである。
ここで、クライアント処理は、クライアントプログラム４００における処理であるとともに、サーバ端末３００のサーバプログラム５００に対してリクエストを送信する処理である。また、レスポンス受信処理は、クライアント処理において送信したリクエストに対する、サーバプログラム５００からのレスポンスを受信する処理である。さらに、レスポンス処理は、レスポンス受信処理で受信したレスポンスに関して、クライアントプログラム４００において実行される処理である。【００１２】
受信待ちループ処理スレッド４４０は、セレクト（select）関数による受信待ちループ処理を実行するスレッドである。
以下、受信待ちループ処理スレッド４４０を単にスレッド４４０ともいう。
具体的には、スレッド４４０は、サーバプログラム５００のスレッド５４０から、レスポンスの送信開始を意味するデータを受信する。なお、セレクト関数は、サーバプログラム５００からレスポンスの送信開始を示すデータを受信したことを判定した場合、あるいはタイムアウトした場合に終了、すなわち、制御がスレッド４４０に復帰する。【００１３】
ここで、オブジェクト４３０が持つ処理や、セレクト関数による受信待ちループ処理は、クライアントプログラム４００によって、スレッドプール４１０内のスレッド４２０のうちの、未使用状態のスレッド（以下、空スレッドという）が割り当てられることにより実行される。これにより、オブジェクト４３０が持つ処理や、セレクト関数による受信待ちループ処理は、当該割り当てられたスレッドにおいて実行される。【００１４】
以下、オブジェクト４３０に対してスレッド４２０−１が割り当てられることとして説明する。
また、セレクト関数による受信待ちループ処理に対してスレッド４２０−２が割り当てられることとして説明する。従って、受信待ちループ処理スレッド４４０は、便宜上、その符号を４４０としているが、実際は、受信待ちループ処理スレッドは、スレッドプール内のスレッドであるスレッド４２０−２である。以下、受信待ちループ処理スレッド４４０を、スレッド４２０−２ともいう。【００１５】
サーバプログラム５００は、上述のように、サーバ端末３００の記憶部３２０に格納され、ＣＰＵ３１０によって記憶部３２０から読み込まれることによって実行される。
サーバプログラム５００は、リクエスト処理を実行するスレッド５４０をそなえる。
スレッド５４０は、クライアントプログラム４００から送信されるリクエストを受信するとともに、当該リクエストに対する所定の処理を実行し、当該リクエストの処理結果であるレスポンスをクライアントプログラム４００に対して送信する。【００１６】
また、スレッド５４０は、クライアントプログラム４００へのレスポンスの送信に先立って、クライアントプログラム４００の受信待ちループ処理スレッド４４０に対してレスポンスの送信開始を意味するデータを送信する。そして、当該データの送信後、クライアントプログラム４００のオブジェクト４３０に対して、リクエストに対するレスポンスを送信する。【００１７】
次に、クライアントプログラム４００及びサーバプログラム５００の動作について説明する。
クライアントプログラム４００は、クライアント処理，レスポンス受信処理及びレスポンス処理を持つオブジェクト４３０を生成すると、スレッドプール４１０から空スレッドを借用する。そして、クライアントプログラム４００は、オブジェクト４３０を、その借用したスレッド（ここでは、スレッド４２０−１）に関連付けて（図９中、Ａ１０１参照）、オブジェクト４３０におけるクライアント処理を実行させる。【００１８】
クライアント処理では、スレッド４２０−１は、セレクト関数による受信待ちループ処理を行なう受信待ちループ処理スレッド４４０（スレッド４２０−２）に対して、受信開始を指示する（図９中、Ａ１０２参照）。そして、スレッド４４０では、サーバプログラム５００からのレスポンスの受信待ちをするループ処理が実行される。
その後、オブジェクト４３０が持つクライアント処理を実行するスレッド４２０−１によって、サーバプログラム５００に対して任意のリクエストが送信される（図９中、Ａ１０３参照）。【００１９】
サーバプログラム５００のスレッド５４０は、クライアントプログラム４００から任意のリクエストが送信されるのを待ち受け、送信されてきたリクエストを受信する。また、スレッド５４０は、受信したリクエストを解釈して、そのリクエストに対応する任意の処理を、リクエスト処理を行なうスレッド５４０で実行する。
次いで、サーバプログラム５００は、リクエスト処理の結果をクライアントプログラム４００に送信するために、送信開始を意味するデータをクライアントプログラム４００に対して送信する（図９中、Ａ１０４参照）。【００２０】
クライアントプログラム４００では、受信待ちループ処理スレッド４４０において、送信開始を意味するデータを受信し、その旨をオブジェクト４３０に関連付けられているスレッド４２０−１に対して通知する（図９中、Ａ１０５参照）。
サーバプログラム５００は、送信開始を意味するデータをクライアントプログラム４００に送信した後、リクエスト処理の実行結果を、リクエストに対するレスポンスとしてクライアントプログラム４００に送信する（図９中、Ａ１０６参照）。【００２１】
クライアントプログラム４００は、オブジェクト４３０と関連付けられているスレッド４２０−１で当該レスポンスを受信し、レスポンスに対する処理を行なう。
次に、図１０を参照しながら、クライアントプログラム４００及びサーバプログラム５００における詳細な処理を説明する。
図１０は、クライアントプログラム４００及びサーバプログラム５００の処理を説明するためのシーケンス図である。【００２２】
はじめに、ユーザによってクライアントプログラム４００が起動されると、クライアントプログラム４００により、スレッドプール４１０が生成される（ステップＳ１０１）。また、スレッドプール４１０においては、その生成過程において、所定の数のスレッド４２０が生成される（ステップＳ１０２）。例えば、図９に示す例においては、クライアントプログラム４００によって、スレッド４２０−１〜４２０−３の３つのスレッドが生成される。【００２３】
そして、クライアントプログラム４００によって、スレッドプール４１０から空スレッドが１つ借用される（ステップＳ１０３）。また、クライアントプログラム４００により、借用されたスレッド（ここでは、スレッド４２０−２；受信待ちループ処理スレッド４４０）においてセレクト関数による受信待ちループ処理が実行され、受信開始指示待ちの状態になる（ステップＳ１０４）。その後、クライアントプログラム４００の処理が終了し、制御がユーザに戻る（ステップＳ１０５）。【００２４】
次いで、ユーザにより任意のリクエストがクライアントプログラム４００に要求されると、クライアントプログラム４００により、クライアント処理，レスポンス受信処理及びレスポンス処理を持つオブジェクト４３０が生成される（ステップＳ１０６）。
また、クライアントプログラム４００によって、スレッドプール４１０から空スレッド４２０が１つ借用される（ステップＳ１０７）。そして、クライアントプログラム４００によって、ステップＳ１０６で生成されたオブジェクト４３０と、ステップＳ１０７で借用された空スレッドとが関連付けられ、当該関連付けられたスレッド（ここでは、スレッド４２０−１）が起動される（ステップＳ１０８）。【００２５】
続いて、オブジェクト４３０に関連付けられたスレッド４２０−１によって、クライアント処理が実行され、受信開始指示待ち状態の受信待ちループ処理スレッド４４０に対して受信開始が指示される（ステップＳ１０９）。
そして、オブジェクト４３０が持つクライアント処理を実行するスレッド４２０−１により、サーバプログラム５００に対するリクエストが送信される（ステップＳ１１０）。【００２６】
サーバプログラム５００では、リクエストが受信され、スレッド５４０によって、そのリクエストに対する任意の処理が実行される（ステップＳ１１１）。
サーバプログラム５００では、スレッド５４０によるリクエストに対する処理が終了すると、サーバプログラム５００によってレスポンスの送信開始がクライアントプログラム４００に対して通知される（ステップＳ１１２）。【００２７】
一方、クライアントプログラム４００では、送信開始を通知されると、その旨が、クライアント処理を実行していた、オブジェクト４３０に関連付けられたスレッド４２０−１に伝えられる。そして、当該スレッド４２０−１によって、オブジェクト４３０のレスポンス受信処理が実行される（ステップＳ１１３）。
次いで、サーバプログラム５００によって、レスポンスがクライアントプログラム４００に対して送信される（ステップＳ１１４）。【００２８】
スレッド４２０−１がレスポンス受信処理でレスポンスを受信し終えると、当該スレッド４２０−１は、受信したレスポンスに関する任意の処理（レスポンス処理）を実行する。そして、スレッド４２０−１は、クライアントプログラム４００に対して、リクエストの結果を通知する（ステップＳ１１５）。
その後、クライアントプログラム４００によって、借用されたスレッド４２０−１及び４２０−２（受信待ちループ処理スレッド４４０）がスレッドプール４１０に返却される。また、クライアントプログラム４００によって、クライアント処理，レスポンス受信処理及びレスポンス処理を持つオブジェクト４３０が、記憶部２２０等のクライアント端末２００のリソースから削除（破棄）される（ステップＳ１１６）。【００２９】
最後に、クライアントプログラム４００により、ユーザにリクエストの結果が渡される（ステップＳ１１７）。
なお、ユーザによってクライアントプログラム４００が終了させられる場合、クライアントプログラム４００により、スレッドプール４１０が破棄される（ステップＳ１１８）。ここで、スレッドプール４１０は、その破棄過程において、ステップＳ１０２において生成した全てのスレッドを破棄する（ステップＳ１１９）。【００３０】
そして、クライアントプログラム４００の実行が終了し、クライアントプログラム４００自体が破棄される（ステップＳ１２０）。
クライアント端末２００及びサーバ端末３００の間では、上述の如くリクエスト及びレスポンスの処理が行なわれる。
次に、図１１を参照しながら、スレッド４２０−１及び４２０−２（受信待ちループ処理スレッド４４０）の処理について、スレッド４２０−１が起動されてから破棄されるまでの過程（図１０のステップＳ１０８〜Ｓ１１６）をより詳細に説明する。【００３１】
図１１は、クライアントプログラム４００における、クライアント処理，レスポンス受信処理及びレスポンス処理を行なうスレッド４２０−１並びに受信待ちループ処理を行なうスレッド４２０−２（受信待ちループ処理スレッド４４０）の処理を説明するためのフローチャートである。
はじめに、図１０のステップＳ１０９において、スレッド４２０−１により、オブジェクト４３０のクライアント処理が実行されると、受信開始指示待ち状態の受信待ちループ処理スレッド４４０に対して受信開始が指示される（図１１のステップＴ１０１）。【００３２】
次いで、スレッド４２０−１により受信開始が指示された受信待ちループ処理スレッド４４０においては、セレクト関数によって、サーバプログラム５００から送信されるレスポンスの送信開始を意味するデータが、指定タイムアウト時間まで待ち受けられる（ステップＴ１０２）。すなわち、セレクト関数によって、レスポンスの受信が可能になることを意味するサーバプログラム５００からのデータが待ち受けられる。【００３３】
そして、スレッド４２０−１では、受信待ちループ処理スレッド４４０に対して受信開始が指示されると、スレッド４２０−１によって、サーバプログラム５００に対してリクエストが送信される（ステップＴ１０３）。
また、受信待ちループ処理スレッド４４０により、セレクト関数からの復帰が、タイムアウトによるものであるか否かが判断される（ステップＴ１０４）。【００３４】
タイムアウトによってセレクト関数から復帰したと判断された場合は、受信待ちループ処理スレッド４４０により、再度、セレクト関数が呼び出されて受信待ちになる（ステップＴ１０４のＹｅｓルート）。
一方、ノンブロックでレスポンスが受信可能になったことによりセレクト関数から復帰したと判断された場合は（ステップＴ１０４のＮｏルート）、受信待ちループ処理スレッド４４０により、スレッド４２０−１に対してレスポンスの受信通知が行なわれる（図９中、Ａ１０５参照）。ここで、ノンブロックでの受信とは、レスポンスの受信を待たずに行なえる他の処理を先に行ないつつ、レスポンスの受信の行なうことである。【００３５】
続いて、ステップＴ１０４のＮｏルートにおいてレスポンスの受信通知を受け取ったスレッド４２０−１によって、オブジェクト４３０のレスポンス受信処理が行なわれる（ステップＴ１０５）。そして、スレッド４２０−１によって、そのレスポンスに対するオブジェクト４３０のレスポンス処理が実行される（ステップＴ１０６）。
スレッド４２０−１によるレスポンス処理が終了すると、クライアントプログラム４００によって、借用していたスレッド４２０−１及び４２０−２がスレッドプール４１０に返却される。また、クライアントプログラム４００によって、スレッド４２０−１と関連付けられたクライアント処理，レスポンス受信処理及びレスポンス処理を実行するオブジェクト４３０が破棄される（ステップＴ１０７）。【００３６】
上述の処理により、オブジェクト４３０に関連付けられたスレッド４２０−１が終了する。
また、従来においては、セッション識別子が、サーバ・システムにおけるプロセスによってクライアント・システムからの要求と関連付けられ、サーバは、セッション識別子を含む応答をクライアント・システムに送る技術が知られている（例えば、特許文献１）。【００３７】
さらに、データベースサーバ内でセッション開始時に新たなスレッドを生成してセッションに処理の実行を割り当てるとともに、クライアントへの返却時にセッション継続の指定がなければセッションのスレッドを終了させる技術が知られている（例えば、特許文献２）。
【先行技術文献】
【特許文献】
【００３８】
【特許文献１】特表平１１−５１０６３２号公報
【特許文献２】特開平１１−１４９４４９号公報
【特許文献３】特開２０００−２９８１５号公報
【発明の概要】
【発明が解決しようとする課題】
【００３９】
クライアントプログラム４００が使用する記憶部２２０の記憶領域の量を抑制するため、クライアントプログラム４００によっては、スレッドプール４１０が管理するスレッド４２０の数が、例えば２，３個に制限されることがある。
この場合、上述のようなクライアントプログラム４００は、受信待ちループ処理スレッド４４０でサーバプログラム５００からレスポンスが送信されるのを待つ間、クライアント処理，レスポンス受信処理及びレスポンス処理を持つオブジェクト４３０は使用されない。このため、その間、オブジェクト４３０を格納している記憶領域は、無駄に使用されている状態になるという問題がある。【００４０】
また、クライアント処理，レスポンス受信処理及びレスポンス処理を持つオブジェクト４３０と関連付けされたスレッド４２０−１は、上記の間、何も処理を実行していない状態になるため、スレッドプール４１０から借用したスレッドが有効に活用されない。そのため、クライアントプログラム４００の処理性能が向上しないという問題がある。
特許文献１〜３の技術のいずれも、サーバ端末側におけるセッションやスレッドの管理に関するものであり、これらの技術によって、クライアント端末側における上述の問題を解決することは難しい。【００４１】
ここまで、図８〜図１１を参照しながら、クライアント・サーバ方式の通信においてクライアント端末２００に生じる問題について説明したが、これに限られない。
例えば、ある端末上で動作するプログラムが、自身のプログラムの他のスレッド，又は自身の端末の他のプログラム等に対してリクエストを送信するとともに、他のスレッド等からレスポンスが返信される場合においても同様である。すなわち、リクエストを送信してから、他のスレッド等からレスポンスが返信されるまでの間は、リクエストを送信したプログラムにおけるクライアント処理，レスポンス受信処理及びレスポンス処理を持つオブジェクトを格納している記憶領域は、無駄に使用されている状態になるという問題がある。【００４２】
また、リクエストを送信したプログラムにおけるクライアント処理，レスポンス受信処理及びレスポンス処理を持つオブジェクトと関連付けされたスレッドは、上記の間、何も処理を実行していない状態になるため、スレッドプールから借用したスレッドが有効に活用されない。そのため、リクエストを送信したプログラムの処理性能が向上しないという問題がある。【００４３】
上述の点に鑑み、本件の目的の１つは、処理を格納する記憶領域及び処理に関連付けられるスレッドの有効活用を図り、プログラムの処理性能の向上を実現することである。
なお、前記目的に限らず、後述する発明を実施するための形態に示す各構成により導かれる作用効果であって、従来の技術によっては得られない作用効果を奏することも本発明の他の目的の１つとして位置付けることができる。
【課題を解決するための手段】
【００４４】
本件のマルチスレッド処理装置は、複数の処理のうちの少なくとも一の処理に対して複数のスレッドのうちの空スレッドを割り当てる管理部と、該管理部によって該空スレッドが割り当てられた該一の処理を実行する処理部と、をそなえ、該処理部は、該複数の処理のうちの第１の処理から、該複数の処理のうちのレスポンスに関する処理を実行する第２の処理を識別するための識別情報を付加したリクエストを送信し、該管理部は、該処理部によって、該第１の処理から該リクエストが送信された場合に、該第１の処理に割り当てられたスレッドを解放して空スレッドにするとともに、該第１の処理を終了させ、該処理部によって、該リクエストに対するレスポンスであって該リクエストに付加された該識別情報を該リクエストの送信先により付加された該レスポンスが受信されると、該処理部が受信した該レスポンスに付加された該識別情報に基づいて、該第２の処理に対して空スレッドを割り当て、該識別情報は、該第２の処理を実行するオブジェクトを生成する関数の関数ポインタであるものである。
また、本件の他のマルチスレッド処理装置は、上記のマルチスレッド処理装置のうち、該識別情報が、該第２の処理を実行するオブジェクトの先頭アドレスであるものである。
【００４５】
また、本件のマルチスレッド処理システムは、上述した本件のマルチスレッド処理装置と、該マルチスレッド処理装置と相互に通信可能に接続された他の装置と、をそなえるマルチスレッド処理システムであって、該処理部は、該他の装置に対して該リクエストを送信し、該他の装置は、該処理部から受信した該リクエストに対する該レスポンスを、該マルチスレッド処理装置に対して送信するものである。【００４６】
また、本件のマルチスレッド処理プログラムは、複数の処理のうちの少なくとも一の処理に対して複数のスレッドのうちの空スレッドを割り当てる管理部、および、該管理部によって該空スレッドが割り当てられた該一の処理を実行する処理部、として、コンピュータを機能させるマルチスレッド処理プログラムであって、該処理部は、該複数の処理のうちの第１の処理から、該複数の処理のうちのレスポンスに関する処理を実行する第２の処理を識別するための識別情報を付加したリクエストを送信し、該管理部は、該処理部によって、該第１の処理から該リクエストが送信された場合に、該第１の処理に割り当てられたスレッドを解放して空スレッドにするとともに、該第１の処理を終了させ、該処理部によって、該リクエストに対するレスポンスであって該リクエストに付加された該識別情報を該リクエストの送信先により付加された該レスポンスが受信されると、該処理部が受信した該レスポンスに付加された該識別情報に基づいて、該第２の処理に対して空スレッドを割り当てるように、該コンピュータを機能させ、該識別情報は、該第２の処理を実行するオブジェクトを生成する関数の関数ポインタであるものである。
【００４７】
また、本件のマルチスレッド処理方法は、複数の処理のうちの少なくとも一の処理に対して複数のスレッドのうちの空スレッドを割り当てて、該空スレッドが割り当てられた該一の処理を実行するマルチスレッド処理方法であって、該複数の処理のうちの第１の処理から、該複数の処理のうちのレスポンスに関する処理を実行する第２の処理を識別するための識別情報を付加したリクエストを送信し、該第１の処理から該リクエストが送信された場合に、該第１の処理に割り当てられたスレッドを解放して空スレッドにするとともに、該第１の処理を終了させ、該リクエストに対するレスポンスであって該リクエストに付加された該識別情報を該リクエストの送信先により付加された該レスポンスが受信されると、該レスポンスに付加された該識別情報に基づいて、該第２の処理に対して空スレッドを割り当て、該識別情報は、該第２の処理を実行するオブジェクトを生成する関数の関数ポインタであるものである。
【発明の効果】
【００４８】
開示の技術によれば、処理を格納する記憶領域及び処理に関連付けられるスレッドの有効活用が図れ、プログラムの処理性能を向上させることができる。
【図面の簡単な説明】
【００４９】
【図１】第１実施形態の一例としてのクライアント・サーバ間通信を行なうシステムの構成例を模式的に示す図である。
【図２】第１実施形態の一例としてのクライアントプログラム及びサーバプログラムの構成例を示す図である。
【図３】クライアントプログラム及びサーバプログラムの処理を説明するためのシーケンス図である。
【図４】クライアントプログラムのスレッドにおける処理を説明するためのフローチャートである。
【図５】第１実施形態の変形例としてのクライアントプログラム及びサーバプログラムの構成例を示す図である。
【図６】クライアントプログラム及びサーバプログラムの処理の変形例を説明するためのシーケンス図である。
【図７】クライアントプログラムのスレッドにおける処理の変形例を説明するためのフローチャートである。
【図８】一般的なクライアント・サーバ間通信を行なうシステムの構成例を示す図である。
【図９】クライアントプログラム及びサーバプログラムの構成例を示す図である。
【図１０】クライアントプログラム及びサーバプログラムの処理を説明するためのシーケンス図である。
【図１１】クライアントプログラムのスレッドにおける処理を説明するためのフローチャートである。
【発明を実施するための形態】
【００５０】
以下、図面を参照して本発明の実施の形態を説明する。
（Ａ）第１実施形態
（Ａ−１）第１実施形態の構成
図１は、第１実施形態の一例としてのクライアント・サーバ間通信を行なうシステム１０の構成例を模式的に示す図である。
【００５１】
図１に示すように、システム１０は、先に説明した図８に示すシステム１００と同様に、クライアント端末２０とサーバ端末３０とをそなえる。また、クライアント端末２０及びサーバ端末３０は、ネットワーク２５を介して相互に通信可能に接続されており、クライアント端末２０からサーバ端末３０へのリクエストに対して、サーバ端末３０がクライアント端末２０へレスポンスを返信する。
【００５２】
クライアント端末２０は、先に説明した図８に示すクライアント端末２００と同様に、マルチスレッド処理を実行することが可能であり、当該処理を実行するＣＰＵ２１，記憶部２２及び送受信部２３をそなえる。
ＣＰＵ２１は、記憶部２２に格納されたクライアントプログラム４０（図２参照）を読み出して、所定のマルチスレッド処理を行なうものであり、管理部２１−１と処理部２１−２とをそなえる。
【００５３】
管理部２１−１は、クライアントプログラム４０の起動後に、スレッドプール４１（図２参照）を生成・管理するとともに、生成したスレッドプール４１内に指定数分のスレッドを生成・管理する。なお、管理部２１−１は、クライアントプログラム４０の終了に際して、生成した指定数分のスレッドを全て破棄するとともに、スレッドプール４１の破棄を行なう。
【００５４】
また、管理部２１−１は、任意のオブジェクトの記憶部２２の記憶領域への展開（生成）及び記憶領域からのオブジェクトの削除（破棄）を行なう。
さらに、管理部２１−１は、複数のオブジェクトのうちの少なくとも１つのオブジェクトに対して、スレッドプール４１内の複数のスレッドのうちの空スレッドを割り当てる。例えば、管理部２１−１は、記憶部２２の記憶領域等にスレッドプール４１内のスレッドが空スレッドであるか否かを示すフラグをスレッド毎に対応付けた管理テーブルをそなえることができ、この管理テーブルを参照することで、オブジェクトに対して空スレッドを割り当てることができる。この場合、管理部２１−１は、空スレッドに対してオブジェクトを割り当てた際に、管理テーブルにおいてオブジェクトに割り当てられたスレッドのフラグを、空スレッドを示すフラグから借用されていることを示すフラグに変更する。
【００５５】
処理部２１−２は、クライアントプログラム４０における所定の処理を実行する。本実施形態においては、処理部２１−２は、管理部２１−１によって処理等が割り当てられたスレッドにおける処理を実行する。
記憶部２２は、種々のデータやプログラムを格納する記憶領域をそなえ、ＣＰＵ２１がプログラムを実行する際に、当該記憶領域に格納されたプログラムを読み出したり、データやプログラムを当該記憶領域に格納・展開して用いられる。
【００５６】
ここで、記憶部２２は、図２を用いて後述する、所定の処理を持つオブジェクトを用いるマルチスレッドプログラムであるクライアントプログラム４０を格納し、ＣＰＵ２１によって、マルチスレッド処理が実行される。
また、サーバ端末３０は、先に説明した図８に示すサーバ端末３００と同様に、ＣＰＵ３１，記憶部３２及び送受信部３３をそなえる。
【００５７】
ＣＰＵ３１は、記憶部３２に格納された後述するサーバプログラム５０を読み出して、所定の処理を行なう。
記憶部３２は、記憶部２２と同様に、種々のデータやプログラムを格納する記憶領域をそなえる。
ここで、記憶部３２は、図２を用いて後述するサーバプログラム５０を格納し、ＣＰＵ３１によって、サーバ端末３０における処理が実行される。
【００５８】
なお、記憶部２２及び３２としては、例えば、ＲＡＭ（Random Access Memory）等が挙げられる。
送受信部２３及び３３は、それぞれ、クライアント端末２０及びサーバ端末３０間で双方向にデータを送受信する。
送受信部２３は、サーバ端末３０に対してＣＰＵ２１からのリクエストを送信するとともに、サーバ端末３０からのレスポンスを受信してＣＰＵ２１に受け渡す。
【００５９】
また、送受信部３３は、クライアント端末２０からのリクエストを受信してＣＰＵ３１に受け渡すとともに、クライアント端末２０に対してＣＰＵ３１からのレスポンスを送信する。
なお、送受信部２３及び３３は、それぞれ、受信した又は送信するデータを一時的に格納する、図示しないバッファメモリをそなえる。
【００６０】
図２は、クライアントプログラム４０及びサーバプログラム５０の構成例を示す図である。
クライアントプログラム４０は、マルチスレッドＯＳ配下で動作するプログラムであり、上述のように、クライアント端末２０の記憶部２２に格納され、ＣＰＵ２１によって記憶部２２から読み込まれることによって実行される。
【００６１】
クライアントプログラム４０は、スレッドプール４１，オブジェクト４３−１，４３−２，及び受信待ちループ処理スレッド４４をそなえる。
スレッドプール４１は、クライアントプログラム４０による処理において用いられる複数のスレッドを生成し管理するものであり、クライアントプログラム４０の起動後に管理部２１−１によって生成される。また、クライアントプログラム４０は、スレッドプール４１の生成過程において、所定の数（ここでは３つ）のスレッド４２−１〜４２−３を生成する。
【００６２】
なお、スレッドプール４１は、管理部２１−１にそなえられる。
オブジェクト４３−１は、クライアントプログラム４０における処理を有するとともに、サーバ端末３０のサーバプログラム５０に対してリクエストを送信するクライアント処理を持つオブジェクトである。
従って、オブジェクト４３−１は、先に説明した図９に示すオブジェクト４３０のクライアント処理に対応するオブジェクトである。
【００６３】
また、本実施形態においては、オブジェクト４３−１は、サーバプログラム５０に送信するリクエストに対して、レスポンス処理を実行するオブジェクト４３−２を識別するための識別情報を付加する処理も有する。本実施形態においては、オブジェクト４３−１は、識別情報として、レスポンス処理を実行するオブジェクト４３−２の、記憶部２２の記憶領域上の先頭アドレス４５を用いる。
【００６４】
オブジェクト４３−２は、レスポンス受信処理で受信したレスポンスに関して、クライアントプログラム４０において実行される処理であるレスポンス処理を実行するオブジェクトである。
従って、オブジェクト４３−２は、先に説明した図９に示すオブジェクト４３０のレスポンス処理に対応するオブジェクトである。
【００６５】
以下、スレッドを示す符号としては、複数のスレッドのうちの１つを特定する必要があるときには符号４２−１〜４２−３を用いるが、任意のスレッドを指すときには符号４２を用いる。また、オブジェクトを示す符号としては、複数のオブジェクトのうちの１つを特定する必要があるときには符号４３−１，４３−２を用いるが、任意のオブジェクトを指すときには符号４３を用いる。
【００６６】
受信待ちループ処理スレッド４４は、セレクト関数による受信待ちループ処理を実行するとともに、レスポンス受信処理を実行するスレッドである。
従って、先に説明した図９に示すオブジェクト４３０のレスポンス受信処理は、受信待ちループ処理スレッド４４によって実行される。
以下、受信待ちループ処理スレッド４４を単にスレッド４４ともいう。
【００６７】
具体的には、スレッド４４は、サーバプログラム５０のスレッド５４から、レスポンスの送信開始を意味するデータを受信するとともに、レスポンスを受信する。
なお、セレクト関数は、サーバプログラム５０からレスポンスの送信開始を示すデータを受信したことを判定した場合、あるいはタイムアウトした場合に終了、すなわち、制御がスレッド４４に復帰する。
【００６８】
また、スレッド４４は、レスポンス受信処理として、クライアント処理において送信したリクエストに対する、サーバプログラム５０からのレスポンスを受信する。
さらに、スレッド４４は、本実施形態においては、後述の如く、サーバプログラム５０によってレスポンスに付加されたオブジェクト４３−２の先頭アドレス４５を取り出す。そして、スレッド４４は、スレッドプール４１から空スレッドを借用し、そのスレッドと、取り出したレスポンス処理を行なうオブジェクト４３−２の先頭アドレス４５とを関連付け、レスポンス処理を行なうスレッド４２−３を実行する。
【００６９】
また、このスレッド４４による処理は、クライアントプログラム４０により、セレクト関数による受信待ちループ処理に対して、スレッドプール４１内の空スレッドが割り当てられることによって実行される。なお、スレッド４４による処理は、オブジェクト４３−１が関連付けられたスレッド４２−１によるリクエストの送信処理が開始される前に実行される。
【００７０】
以下、管理部２１−１によって、オブジェクト４３−１に対してスレッド４２−１が割り当てられ、オブジェクト４３−２に対してスレッド４２−３が割り当てられることとして説明する。また、管理部２１−１によって、セレクト関数による受信待ちループ処理及びレスポンス受信処理に対して、スレッドプール４１内のスレッド４２−２が割り当てられることとして説明する。従って、受信待ちループ処理スレッド４４は、便宜上、その符号を４４としているが、実際は、受信待ちループ処理スレッドは、スレッドプール内のスレッドであるスレッド４２−２である。以下、受信待ちループ処理スレッド４４を、スレッド４２−２ともいう。
【００７１】
サーバプログラム５０は、上述のように、サーバ端末３０の記憶部３２に格納され、ＣＰＵ３１によって記憶部３２から読み込まれることによって実行される。
サーバプログラム５０は、リクエスト処理を実行するスレッド５４をそなえる。
スレッド５４は、クライアントプログラム４０から送信されるリクエストを受信するとともに、リクエストに付加されたオブジェクト４３−２の先頭アドレス４５を取り出し、記憶部３２に格納する。そして、スレッド５４は、リクエストの処理結果であるレスポンスに対して、記憶部３２に格納したオブジェクト４３−２の先頭アドレス４５を付加して、受信待ちループ処理スレッド４４に送信する。
【００７２】
また、スレッド５４は、クライアントプログラム４０へのレスポンスの送信に先立って、クライアントプログラム４０の受信待ちループ処理スレッド４４に対してレスポンスの送信開始を意味するデータを送信する。当該データの送信後、スレッド５４は、受信待ちループ処理スレッド４４に対して、オブジェクト４３−２の先頭アドレス４５を付加したレスポンスを送信する。
【００７３】
（Ａ−２）第１実施形態の動作
次に、クライアントプログラム４０及びサーバプログラム５０の動作について説明する。
クライアントプログラム４０は、クライアント処理を持つオブジェクト４３−１を生成すると、スレッドプール４１から空スレッドを借用する。そして、クライアントプログラム４０は、オブジェクト４３−１を、その借用したスレッド（ここでは、スレッド４２−１）に関連付けて（図２中、Ａ１参照）、オブジェクト４３−１におけるクライアント処理を実行する。
【００７４】
クライアント処理では、スレッド４２−１は、セレクト関数による受信待ちループ処理を行なう受信待ちループ処理スレッド４４（スレッド４２−２）に対して、受信開始を指示する（図２中、Ａ２参照）。そして、スレッド４４では、サーバプログラム５０からのレスポンスのセレクト関数による受信待ちをするループ処理が実行される。
また、クライアント処理を実行するスレッド４２−１は、レスポンス処理を持つオブジェクト４３−２の記憶領域上の先頭アドレス４５を取得し、サーバプログラム５０に対して送信する任意のリクエストデータに、取得した先頭アドレス４５を付加する（図２中、Ａ３参照）。
【００７５】
その後、スレッド４２−１は、サーバプログラム５０に対して先頭アドレス４５を付加した任意のリクエストを送信する（図２中、Ａ４参照）。
サーバプログラム５０のスレッド５４は、クライアントプログラム４０から任意のリクエストが送信されるのを待ち受け、送信されてきたリクエストを受信するとともに、リクエストに付加された先頭アドレス４５を取り出す。また、スレッド５４は、受信したリクエストを解釈して、そのリクエストに対応する任意の処理を、リクエスト処理を行なうスレッド５４で実行する。さらに、スレッド５４は、リクエスト処理の結果であるレスポンスに対して、取り出した先頭アドレス４５を付加する（図２中、Ａ５参照）。
【００７６】
次いで、スレッド５４は、レスポンスをクライアントプログラム４０に送信するために、送信開始を意味するデータをクライアントプログラム４０に対して送信する（図２中、Ａ６参照）。
そして、スレッド５４は、送信開始を意味するデータをクライアントプログラム４０に送信した後、先頭アドレス４５を付加したレスポンスをクライアントプログラム４０に送信する（図２中、Ａ７参照）。
【００７７】
クライアントプログラム４０では、受信待ちループ処理スレッド４４が、送信開始を意味するデータを受信する。そして、スレッド４４は、レスポンス受信処理において、先頭アドレス４５が付加されたレスポンスを受信し、受信したレスポンスに付加された先頭アドレス４５から、オブジェクト４３−２を取得する（図２中、Ａ８参照）。
また、スレッド４４は、スレッドプール４１から空スレッドを借用する。そして、スレッド４４は、取得したオブジェクト４３−２を、その借用したスレッド（ここでは、スレッド４２−３）に関連付ける（図２中、Ａ９参照）。
【００７８】
以降、クライアントプログラム４０は、上述の如くスレッド４２−３に対応付けたオブジェクト４３−２におけるレスポンス処理を実行する。
ここで、上述のようなクライアントプログラム４０及びサーバプログラム５０における処理は、クライアント端末２０及びサーバ端末３０における管理部２１−１及び処理部２１−２等において、以下のように実行される。
【００７９】
管理部２１−１は、クライアントプログラム４０が起動されると、スレッドプール４１を生成するとともに、所定の数のスレッド４２を生成する。以後、管理部２１−１は、スレッドプール４１内のスレッド４２を管理し、処理部２１−２による、クライアント処理（第１の処理），レスポンス処理（第２の処理），受信待ちループ処理及びレスポンス受信処理等の実行に際して、当該処理を空スレッドに対して割り当てる。
【００８０】
処理部２１−２がスレッド４２−１においてリクエストを送信する前に、管理部２１−１は、受信待ちループ処理スレッド４４として、リクエストに対するレスポンスを受信する処理を空スレッド４２−２に割り当てる。
また、処理部２１−２は、リクエストを送信する前に、受信待ちループ処理スレッド４４（スレッド４２−２）によりレスポンスを受信する処理を開始する。
【００８１】
そして、処理部２１−２は、スレッド４２−１の処理において、レスポンス処理（第２の処理）を識別（特定）するための識別情報、すなわち、本実施形態においてはレスポンス処理を持つオブジェクト４３−２の先頭アドレス４５を付加して、リクエストを送信する。
管理部２１−１は、処理部２１−２によって、クライアント処理（第１の処理）からリクエストが送信された場合に、クライアント処理に割り当てられたスレッド４２−１を解放して空スレッドにする。すなわち、管理部２１−１は、クライアント処理を持つオブジェクト４３−１とスレッド４２−１との関連付けを解放する。そして、管理部２１−１は、クライアント処理（第１の処理）を終了させる。すなわち、管理部２１−１は、クライアント処理を持つオブジェクト４３−１を記憶部２２の記憶領域から削除する。
【００８２】
一方、リクエストの送信先としてのサーバプログラム５０は、リクエストに付加された識別情報をレスポンスに付加して、処理部２１−２に対して返信する。
管理部２１−１は、処理部２１−２によって、リクエストに対するレスポンスが受信されると、処理部２１−２が受信したレスポンスに付加された識別情報に基づいて、複数の処理のうちのレスポンスに関する処理を実行するレスポンス処理（第２の処理）に対して空スレッドを割り当てる。すなわち、管理部２１−１は、レスポンス処理を持つオブジェクト４３−２を空スレッド４２−３に割り当てる。
【００８３】
次に、図３を参照しながら、クライアントプログラム４０及びサーバプログラム５０における詳細な処理を説明する。
図３は、クライアントプログラム４０及びサーバプログラム５０の処理を説明するためのシーケンス図である。
はじめに、ユーザによってクライアントプログラム４０が起動されると、クライアントプログラム４０により、スレッドプール４１が生成される（ステップＳ１）。また、スレッドプール４１においては、その生成過程において、所定の数のスレッド４２が生成される（ステップＳ２）。例えば、図２に示す例においては、クライアントプログラム４０によって、スレッド４２−１〜４２−３の３つのスレッドが生成される。
【００８４】
そして、クライアントプログラム４０によって、スレッドプール４１から空スレッドが１つ借用される（ステップＳ３）。また、クライアントプログラム４０により、借用されたスレッド（ここでは、スレッド４２−２；受信待ちループ処理スレッド４４）を用いてセレクト関数による受信待ちループ処理が実行され、受信開始指示待ちの状態になる（ステップＳ４）。その後、クライアントプログラム４０の処理が終了し、制御がユーザに戻る（ステップＳ５）。
【００８５】
次いで、ユーザにより任意のリクエストがクライアントプログラム４０に要求されると、クライアントプログラム４０により、クライアント処理を持つオブジェクト４３−１及びレスポンス処理を持つオブジェクト４３−２がそれぞれ生成される（ステップＳ６）。
また、クライアントプログラム４０によって、スレッドプール４１から空スレッド４２が１つ借用される（ステップＳ７）。そして、クライアントプログラム４０によって、ステップＳ６で生成されたクライアント処理を持つオブジェクト４３−１と、ステップＳ７で借用された空スレッドとが関連付けられ、当該関連付けられたスレッド（ここでは、スレッド４２−１）が起動される（ステップＳ８）。
【００８６】
続いて、オブジェクト４３−１に関連付けられたスレッド４２−１によって、クライアント処理が実行され、受信開始指示待ち状態の受信待ちループ処理スレッド４４に対して受信開始が指示される（ステップＳ９）。
そして、オブジェクト４３−１が持つクライアント処理を実行するスレッド４２−１により、サーバプログラム５０に対するリクエストが送信される（ステップＳ１０）。
【００８７】
このとき、本実施形態においては、スレッド４２−１は、リクエストに対して、レスポンス処理を持つオブジェクト４３−２の先頭アドレス４５を付加して送信し、送信が完了すると、リクエスト送信済みをクライアントプログラム４０に通知する。リクエスト送信済みが通知されると、クライアントプログラム４０は、借用したスレッド４２−１をスレッドプール４１に返却するとともに、生成したオブジェクト４３−１を破棄する。
【００８８】
これにより、クライアントプログラム４０は、オブジェクト４３−１が展開されていた記憶部２２の記憶領域を他の処理で使用できるようになる。また、オブジェクト４３−１が関連付けられていたスレッド４２−１が、返却されることにより空スレッドとなるため、クライアントプログラム４０は、スレッド４２−１を他の処理に割り当てることができるようになる。
【００８９】
次いで、サーバプログラム５０では、リクエストが受信され、スレッド５４によって、そのリクエストに対する任意の処理が実行される（ステップＳ１１）。
このとき、本実施形態においては、スレッド５４によって、受信したリクエストに付加されたレスポンス処理を持つオブジェクト４３−２の先頭アドレス４５が取り出され、サーバ端末３０の記憶部３２等に一時的に保持される。
【００９０】
サーバプログラム５０では、スレッド５４によるリクエストに対する処理が終了すると、サーバプログラム５０によってレスポンスの送信開始がクライアントプログラム４０に対して通知される（ステップＳ１２）。
一方、クライアントプログラム４０では、送信開始を通知されると、その旨が、レスポンス受信処理を実行するスレッド４２−２（受信待ちループ処理スレッド４４）に伝えられる。そして、クライアントプログラム４０では、当該受信待ちループ処理スレッド４４によって、レスポンス受信処理が実行される（ステップＳ１３）。
【００９１】
次いで、サーバプログラム５０のスレッド５４によって、レスポンスがクライアントプログラム４０に対して送信される（ステップＳ１４）。
このとき、本実施形態においては、スレッド５４によって、記憶部３２等に一時的に保持していたレスポンス処理を持つオブジェクト４３−２の先頭アドレス４５が取り出され、レスポンスに付加して送信される。スレッド４４がレスポンスを受信し終えると、本実施形態においては、スレッド４４によって、受信したレスポンスからレスポンス処理を持つオブジェクト４３−２の先頭アドレス４５が取り出され、オブジェクト４３−２が取得される。また、スレッド４４によって、スレッドプール４１から空スレッドが借用されるとともに、取得されたオブジェクト４３−２が当該空スレッド（ここでは、スレッド４２−３）に関連付けられる。さらに、スレッド４４によって、スレッド４２−３が起動される。そして、スレッド４２−３によって、任意のレスポンス処理が実行されるとともに、レスポンス処理の結果がクライアントプログラム４０に対して通知される（ステップＳ１５）。
【００９２】
その後、クライアントプログラム４０によって、借用されたスレッド４２−３がスレッドプール４１に返却される。また、クライアントプログラム４０によって、レスポンス処理を持つオブジェクト４３−２が、記憶部２２の記憶領域、すなわちクライアント端末２０のリソースから削除（破棄）される（ステップＳ１６）。
最後に、クライアントプログラム４０により、ユーザにリクエストの結果が渡される（ステップＳ１７）。
【００９３】
なお、ユーザによってクライアントプログラム４０が終了させられる場合、クライアントプログラム４０により、スレッドプール４１が破棄される（ステップＳ１８）。ここで、スレッドプール４１は、その破棄過程において、ステップＳ２において生成した全てのスレッドを破棄する（ステップＳ１９）。
そして、クライアントプログラム４０の実行が終了し、クライアントプログラム４０自体が破棄される（ステップＳ２０）。
【００９４】
本実施形態におけるクライアント端末２０及びサーバ端末３０の間では、上述の如くリクエスト及びレスポンスの処理が行なわれる。
次に、図４を参照しながら、スレッド４２−１〜４２−３の処理について、スレッド４２−１が起動されてからスレッド４２−３が破棄されるまでの過程（図３のステップＳ８〜Ｓ１６）をより詳細に説明する。
【００９５】
図４は、クライアントプログラム４０における、クライアント処理を行なうスレッド４２−１，受信待ちループ処理を行なうスレッド４２−２（受信待ちループ処理スレッド４４）及びレスポンス処理を行なうスレッド４２−３の処理を説明するためのフローチャートである。
はじめに、図３のステップＳ９において、スレッド４２−１により、オブジェクト４３−１のクライアント処理が開始されると、受信開始指示待ち状態の受信待ちループ処理スレッド４４に対して受信開始が指示される（図４のステップＴ１）。
【００９６】
次いで、スレッド４２−１により受信開始が指示された受信待ちループ処理スレッド４４においては、セレクト関数によって、サーバプログラム５０から送信されるレスポンスの送信開始を意味するデータが、指定タイムアウト時間まで待ち受けられる（ステップＴ２）。すなわち、セレクト関数によって、サーバプログラム５０からのレスポンスの受信が可能になることを意味するデータが待ち受けられる。
【００９７】
そして、スレッド４２−１では、受信待ちループ処理スレッド４４に対して受信開始が指示されると、スレッド４２−１によって、サーバプログラム５０に対して任意のリクエストが送信される（ステップＴ３）。
このとき、スレッド４２−１により、レスポンス処理を持つオブジェクト４３−２への先頭アドレス４５がリクエストに付加されて送信されるとともに、クライアントプログラム４０に対してリクエストを送信したことが通知される。
【００９８】
そして、リクエストの送信がスレッド４２−１から通知されると、クライアントプログラム４０によって、オブジェクト４３−１とスレッド４２−１との関連付けが解放され、スレッド４２−１がスレッドプール４１に返却される（ステップＴ４）。また、クライアントプログラム４０によって、クライアント処理を持つオブジェクト４３−１が破棄される（ステップＴ５）。
【００９９】
これにより、クライアント処理を実行するスレッド４２−１が終了される。
一方、受信待ちループ処理スレッド４４においては、上述したステップＴ１以降、セレクト関数によって、サーバプログラム５０から送信されるレスポンスの送信開始を意味するデータが待ち受けられている。
ここで、セレクト関数は、上述のように、レスポンスの送信開始を意味するデータの受信又は指定タイムアウト時間の経過により終了し、制御がスレッド４４に復帰する。
【０１００】
このため、スレッド４４においては、セレクト関数からの復帰が、タイムアウトによるものであるか否かが判断される（ステップＴ６）。
スレッド４４において、タイムアウトによってセレクト関数から復帰したと判断された場合は、スレッド４４により、再度、セレクト関数が呼び出されて受信待ちになる（ステップＴ６のＹｅｓルート）。
【０１０１】
一方、ノンブロックでレスポンスが受信可能になったことによりセレクト関数から復帰したと判断された場合は（ステップＴ６のＮｏルート）、スレッド４４で実行されるレスポンス受信処理によって、サーバプログラム５０から送信されたレスポンスが受信される。このとき、スレッド４４によって、レスポンスに付加されたレスポンス処理を持つオブジェクト４３−２の先頭アドレス４５が取得される（ステップＴ７）。
【０１０２】
また、レスポンス受信処理が実行されるスレッド４４によって、スレッドプール４１から空スレッドが借用される（ステップＴ８）。そして、スレッド４４によって、取得されたレスポンス処理を持つオブジェクト４３−２の先頭アドレス４５が空スレッド（ここでは、４２−３）に関連付けられるとともに、レスポンス処理を実行するスレッド４２−３が開始される（ステップＴ９）。
【０１０３】
続いて、レスポンス処理を実行するスレッド４２−３によって、スレッド４４で受信したレスポンスに対するレスポンス処理が実行される（ステップＴ１０）。
スレッド４２−３によるレスポンス処理が終了すると、クライアントプログラム４０によって、オブジェクト４３−２とスレッド４２−３との関連付けが解放され、スレッド４２−３がスレッドプール４１に返却される（ステップＴ１１）。また、クライアントプログラム４０によって、レスポンス処理を持つオブジェクト４３−２が破棄される（ステップＴ１２）。
【０１０４】
これにより、レスポンス処理を実行するスレッド４２−３が終了される。
上述の手順により、クライアント・サーバ間通信が行なわれる。
このように、本実施形態の一例としての管理部２１−１及び処理部２１−２によれば、処理部２１−２によって、複数の処理のうちのクライアント処理（第１の処理）、すなわち、クライアント処理を持つオブジェクト４３−１からリクエストが送信された場合に、管理部２１−１により、クライアント処理（第１の処理）に割り当てられたスレッド４２−１が解放されて空スレッドにされる。そして、管理部２１−１により、クライアント処理（第１の処理）が終了させられる。すなわち、管理部２１−１により、クライアント処理を持つオブジェクト４３−１が記憶部２２の記憶領域から削除される。
【０１０５】
また、処理部２１−２によって、リクエストに対するレスポンスが受信されると、管理部２１−１により、複数の処理のうちのレスポンスに関する処理を実行するレスポンス処理に対して空スレッドが割り当てられる。すなわち、管理部２１−１により、レスポンス処理を持つオブジェクト４３−２が空スレッド４２−３に割り当てられる。
このように、本実施形態によれば、リクエストを送信するクライアント処理（オブジェクト４３−１）と、レスポンスに関する処理を実行するレスポンス処理（オブジェクト４３−２）とが分離される。これにより、処理部２１−２によるリクエストの送信後、管理部２１−１は、クライアント処理（第１の処理）が割り当てられたスレッド４２−１を解放して空スレッドにする。すなわち、管理部２１−１は、クライアント処理を持つオブジェクト４３−１とスレッド４２−１との関連付けを解放し、オブジェクト４３−１を格納した記憶部２２の記憶領域を解放することができる。
【０１０６】
従って、記憶部２２の記憶領域が他の用途に使用可能になり、記憶領域の有効活用を図ることができる。
また、スレッド４２−１を解放して空スレッドにすることで、スレッド４２−１を他の処理に用いることが可能となり、スレッドの有効活用を図ることができ、クライアントプログラム４０の処理性能を向上させることができる。
【０１０７】
また、スレッド４４によるレスポンスの受信後に、管理部２１−１により、レスポンス処理（第２の処理）に対して空スレッドが割り当てられる。すなわち、管理部２１−１により、レスポンス処理を持つオブジェクト４３−２に空スレッド４３−３が割り当てられるため、リクエストの送信後レスポンスの受信までの間はスレッド４３−３を空スレッドとしておくことができる。
【０１０８】
従って、スレッド４４によってレスポンスが受信されるまでは、スレッド４２−３を他の処理に用いることが可能となり、スレッドの有効活用を図ることができ、クライアントプログラム４０の処理性能を向上させることができる。
また、本実施形態の一例としての管理部２１−１及び処理部２１−２によれば、処理部２１−２により、レスポンス処理（第２の処理）を識別するための識別情報、すなわち、本実施形態においては、レスポンス処理を持つオブジェクト４３−２の先頭アドレス４５が付加されて、リクエストが送信される。そして、リクエストに付加された識別情報をリクエストの送信先としてのサーバプログラム５０により付加されたレスポンスが、処理部２１−２によって受信されると、管理部２１−１により、処理部２１−２が受信したレスポンスに付加された識別情報に基づいて、レスポンスに関する処理を実行するレスポンス処理（第２の処理）に対して空スレッドが割り当てられる。すなわち、管理部２１−１により、レスポンス処理を持つオブジェクト４３−２が空スレッド４２−３に割り当てられる。
【０１０９】
このように、処理部２１−２は、クライアント処理（第１の処理）において、送信するリクエストに対して、サーバプログラム５０からのレスポンスを受信後にクライアントプログラム４０が再開する処理を特定するための識別情報を付加する。本実施形態においては、処理部２１−２は、送信するリクエストに対して、レスポンス処理（第２の処理）を識別するための識別情報として、レスポンス処理を持つオブジェクト４３−２の先頭アドレス４５を付加する。これにより、クライアントプログラム４０がオブジェクト４３−１を終了させても、スレッド４４は、レスポンスの受信時に、当該識別情報に基づいてレスポンス処理を持つオブジェクト４３−２を確実に特定し、レスポンス処理、すなわち、クライアントプログラム４０の再開処理を実行することができる。
【０１１０】
さらに、本実施形態の一例としての管理部２１−１は、複数のスレッド４２を予め生成し管理するスレッドプール４１をそなえる。
このように、管理部２１−１は、スレッドプール４１に予め複数のスレッド４２を生成しておくことで、クライアント処理（第１の処理）及びレスポンス処理（第２の処理）並びに受信待ちループ処理及びレスポンス受信処理等を既存の空スレッドに割り当てることができる。これにより、クライアントプログラム４０（管理部２１−１）は、クライアント処理及びレスポンス処理並びに受信待ちループ処理及びレスポンス受信処理等を割り当てる都度、スレッドを生成せずに済み、クライアントプログラム４０の処理性能を向上させることができる。
【０１１１】
（Ｂ）第１実施形態の変形例
（Ｂ−１）第１実施形態の変形例の構成
第１実施形態の一例としてのクライアントプログラム４０及びサーバプログラム５０については、上述した動作に限らず、例えば以下に図５〜図７を参照しながら説明する第１実施形態の変形例のように実行してもよい。
【０１１２】
なお、この変形例としてのクライアントプログラム４０′及びサーバプログラム５０′においても、以下、特に説明のない限り、上述した第１実施形態の一例としてのクライアントプログラム４０及びサーバプログラム５０と同様の構成をそなえるため、その説明を省略する。
本変形例においては、スレッド４２−１によるリクエストには、オブジェクト４３−２を識別するための識別情報として、オブジェクト４３−２の先頭アドレス４５の代わりに、オブジェクト４３−２を生成する生成関数４６の関数ポインタ４７が付加される。
【０１１３】
図５は、クライアントプログラム４０′及びサーバプログラム５０′の構成例を示す図である。
クライアントプログラム４０′は、先に説明した図２に示すクライアントプログラム４０と比較して、オブジェクト４３−１の代わりにオブジェクト４３−１′を、受信待ちループ処理スレッド４４の代わりに受信待ちループ処理スレッド４４′をそなえる。
【０１１４】
また、クライアントプログラム４０′は、新たにオブジェクト生成関数４６及び関数ポインタ４７をそなえる。
オブジェクト４３−１′は、図２に示すオブジェクト４３−１と比較して、処理部２１−２により、スレッド４２−１において送信されるリクエストに対して、オブジェクト４３−１を生成する生成関数４６の関数ポインタ４７を付加する点が異なる。
【０１１５】
受信待ちループ処理スレッド４４′（以下、単にスレッド４４′ともいう）は、処理部２１−２によるレスポンス受信処理において、後述の如く、サーバプログラム５０′によってレスポンスに付加されたオブジェクト４３−２を生成する生成関数４６の関数ポインタ４７を取り出す。そして、スレッド４４′は、処理部２１−２によって、取り出した関数ポインタ４７によってレスポンス処理を持つオブジェクト４３−２を生成する生成関数４６を呼び出して、オブジェクト４３−２を生成する。また、スレッド４４′は、管理部２１−１によって、スレッドプール４１から空スレッドを借用し、そのスレッドと、取り出したレスポンス処理を行なうオブジェクト４３−２とを関連付け、レスポンス処理を行なうスレッド４２−３を実行する。
【０１１６】
このように、本変形例においては、オブジェクト４３−２は、クライアントプログラム４０′が起動されてから、スレッド４４′がサーバプログラム５０′から受信したレスポンスから関数ポインタ４７を取り出すまでは生成されない。
以下、管理部２１−１によって、オブジェクト４３−１′に対してスレッド４２−１が割り当てられ、オブジェクト４３−２に対してスレッド４２−３が割り当てられることとして説明する。また、管理部２１−１によって、セレクト関数による受信待ちループ処理及びレスポンス受信処理に対して、スレッドプール４１内のスレッド４２−２が割り当てられることとして説明する。従って、受信待ちループ処理スレッド４４′は、便宜上、その符号を４４′としているが、実際は、受信待ちループ処理スレッドは、スレッドプール内のスレッドであるスレッド４２−２である。以下、受信待ちループ処理スレッド４４′を、スレッド４２−２ともいう。
【０１１７】
サーバプログラム５０′は、先に説明した図２に示すサーバプログラム５０と比較して、スレッド５４の代わりにスレッド５４′をそなえる。
スレッド５４′は、クライアントプログラム４０′から受信したリクエストに付加された関数ポインタ４７を取り出し、記憶部３２に格納する。そして、スレッド５４′は、リクエストの処理結果であるレスポンスに対して、記憶部３２に格納した関数ポインタ４７を付加して、受信待ちループ処理スレッド４４′に送信する。
【０１１８】
（Ｂ−２）第１実施形態の変形例の動作
次に、クライアントプログラム４０′及びサーバプログラム５０′の動作について説明する。
この図５に示す手順では、図２に示すＡ３〜Ａ５及びＡ７に替えて、Ａ３′〜Ａ５′及びＡ７′が実行されるとともに、新たにＡ８−１及びＡ８−２が実行される。また、この図５に示す手順では、図２に示すＡ８は実行されない。
【０１１９】
なお、図中、既述の符号と同一の符号が付された手順は、同一もしくは略同一の手順を示しているので、その説明の一部を省略する。
以下、処理部２１−２により、スレッド４４′において、サーバプログラム５０からのレスポンスのセレクト関数による受信待ちをするループ処理が実行されている場合について説明する。
【０１２０】
クライアント処理を実行するスレッド４２−１は、レスポンス処理を持つオブジェクト４３−２の生成関数４６の関数ポインタ４７を取得し、サーバプログラム５０′に対して送信する任意のリクエストデータに、取得した関数ポインタ４７を付加する（図５中、Ａ３′参照）。
その後、スレッド４２−１は、サーバプログラム５０′に対して関数ポインタ４７を付加した任意のリクエストを送信する（図５中、Ａ４′参照）。
【０１２１】
サーバプログラム５０′のスレッド５４′は、クライアントプログラム４０′から任意のリクエストが送信されるのを待ち受け、送信されてきたリクエストを受信するとともに、リクエストに付加された関数ポインタ４７を取り出す。また、スレッド５４′は、受信したリクエストを解釈して、そのリクエストに対応する任意の処理を、リクエスト処理を行なうスレッド５４で実行する。さらに、スレッド５４は、リクエスト処理の結果であるレスポンスに対して、取り出した関数ポインタ４７を付加する（図５中、Ａ５′参照）。
【０１２２】
次いで、スレッド５４′は、レスポンスをクライアントプログラム４０′に送信するために、送信開始を意味するデータをクライアントプログラム４０′に対して送信する（図５中、Ａ６参照）。
そして、スレッド５４′は、送信開始を意味するデータをクライアントプログラム４０′に送信した後、関数ポインタ４７を付加したレスポンスをクライアントプログラム４０′に送信する（図５中、Ａ７′参照）。
【０１２３】
クライアントプログラム４０′では、受信待ちループ処理スレッド４４′が、送信開始を意味するデータを受信する。そして、スレッド４４′は、レスポンス受信処理において、受信したレスポンスに付加された関数ポインタ４７から生成関数４６を読み出し（図５中、Ａ８−１参照）、生成関数４６を実行してオブジェクト４３−２を生成する（図５中、Ａ８−２参照）。
【０１２４】
また、スレッド４４′は、スレッドプール４１から空スレッドを借用する。そして、スレッド４４′は、生成したオブジェクト４３−２を、その借用したスレッド（ここでは、スレッド４２−３）に関連付ける（図５中、Ａ９参照）。
以降、クライアントプログラム４０′は、処理部２１−２によって、上述の如く生成したオブジェクト４３−２におけるレスポンス処理を実行する。
【０１２５】
次に、図６を参照しながら、クライアントプログラム４０′及びサーバプログラム５０′における詳細な処理を説明する。
図６は、クライアントプログラム４０′及びサーバプログラム５０′の処理を説明するためのシーケンス図である。
この図６に示す手順では、図３に示すステップＳ６，Ｓ１０，Ｓ１１，Ｓ１４及びＳ１５に替えて、ステップＳ６′，Ｓ１０′，Ｓ１１′，Ｓ１４′及びＳ１５′が実行される。
【０１２６】
なお、図中、既述の符号と同一の符号が付されたステップは、同一もしくは略同一のステップを示しているので、その説明の一部を省略する。
以下、処理部２１−２により、ユーザにより任意のリクエストがクライアントプログラム４０に要求された場合について説明する。
クライアントプログラム４０により、クライアント処理を持つオブジェクト４３−１が生成される（ステップＳ６′）。
【０１２７】
このとき、本変形例では、レスポンス処理を持つオブジェクト４３−２が占有する分の記憶部２２の記憶領域を他の処理で使用することができる。
また、オブジェクト４３−１にスレッド４２−１が関連付けられ、スレッド４２−１が実行されて、受信開始指示待ち状態の受信待ちループ処理スレッド４４′に対して受信開始が指示される（ステップＳ７〜Ｓ９）。
【０１２８】
そして、オブジェクト４３−１′が持つクライアント処理を実行するスレッド４２−１により、サーバプログラム５０′に対するリクエストが送信される（ステップＳ１０′）。
このとき、本変形例においては、スレッド４２−１は、リクエストに対して、レスポンス処理を持つオブジェクト４３−２を生成する生成関数４６の関数ポインタ４７を付加して送信し、送信が完了すると、リクエスト送信済みをクライアントプログラム４０′に通知する。リクエスト送信済みが通知されると、クライアントプログラム４０′は、借用したスレッド４２−１をスレッドプール４１に返却するとともに、生成したオブジェクト４３−１′を破棄する。
【０１２９】
これにより、クライアントプログラム４０は、オブジェクト４３−１が展開されていた記憶部２２の記憶領域を他の処理で使用できるようになる。また、オブジェクト４３−１が関連付けられていたスレッド４２−１が、返却されることにより空スレッドとなるため、クライアントプログラム４０は、スレッド４２−１を他の処理に割り当てることができるようになる。
【０１３０】
次いで、サーバプログラム５０′では、リクエストが受信され、スレッド５４′によって、そのリクエストに対する任意の処理が実行される（ステップＳ１１′）。
このとき、本実施形態においては、スレッド５４′によって、受信したリクエストに付加された関数ポインタ４７が取り出され、サーバ端末３０の記憶部３２等に一時的に保持される。
【０１３１】
また、サーバプログラム５０′からレスポンスの送信開始がクライアントプログラム４０に対して通知され、クライアントプログラム４０′によって、受信待ちループ処理スレッド４４′によって、レスポンス受信処理が実行される（ステップＳ１２，Ｓ１３）。
次いで、サーバプログラム５０′のスレッド５４′によって、レスポンスがクライアントプログラム４０′に対して送信される（ステップＳ１４′）。
【０１３２】
このとき、本変形例においては、スレッド５４′によって、記憶部３２等に一時的に保持していたレスポンス処理を持つオブジェクト４３−２を生成する生成関数４６の関数ポインタ４７が取り出され、レスポンスに付加して送信される。スレッド４４′がレスポンスを受信し終えると、本変形例においては、スレッド４４′によって、受信したレスポンスからレスポンス処理を持つオブジェクト４３−２を生成する生成関数４６の関数ポインタ４７が取り出される。そして、スレッド４４′によって、生成関数４６を呼び出すことによって、オブジェクト４３−２が生成される。また、スレッド４４′によって、スレッドプール４１から空スレッドが借用されるとともに、生成されたオブジェクト４３−２が当該空スレッド（ここでは、スレッド４２−３）に関連付けられる。さらに、スレッド４４′によって、スレッド４２−３が起動される。そして、スレッド４２−３によって、任意のレスポンス処理が実行されるとともに、レスポンス処理の結果がクライアントプログラム４０′に対して通知される（ステップＳ１５′）。
【０１３３】
以降、ステップＳ１６〜Ｓ２０において、スレッド４２−３の返却，オブジェクト４３−２の削除がされ、クライアントプログラム４０により、ユーザにリクエストの結果が渡される（ステップＳ１６，Ｓ１７）。
また、ユーザによってクライアントプログラム４０が終了させられる場合、クライアントプログラム４０の終了が行なわれる（ステップＳ１８〜Ｓ２０）。
【０１３４】
本実施形態におけるクライアント端末２０及びサーバ端末３０の間では、上述の如くリクエスト及びレスポンスの処理が行なわれる。
次に、図７を参照しながら、スレッド４２−１〜４２−３の処理について、スレッド４２−１が起動されてからスレッド４２−３が破棄されるまでの過程（図６のステップＳ８′〜Ｓ１６）をより詳細に説明する。
【０１３５】
図７は、クライアントプログラム４０′における、クライアント処理を行なうスレッド４２−１，受信待ちループ処理を行なうスレッド４２−２（受信待ちループ処理スレッド４４）及びレスポンス処理を行なうスレッド４２−３の処理を説明するためのフローチャートである。
この図７に示す手順では、図４に示すステップＴ３及びＴ７に替えて、ステップＴ３′及びＴ７−１が実行されるとともに、新たにステップＴ７−２が実行される。。
【０１３６】
なお、図中、既述の符号と同一の符号が付されたステップは、同一もしくは略同一のステップを示しているので、その説明の一部を省略する。
以下、スレッド４２−１により受信開始が指示された受信待ちループ処理スレッド４４において、レスポンスの送信開始を意味するデータが待ち受けられている場合について説明する。
【０１３７】
スレッド４２−１では、受信待ちループ処理スレッド４４′に対して受信開始が指示されると、スレッド４２−１によって、サーバプログラム５０′に対して任意のリクエストが送信される（ステップＴ３′）。
このとき、スレッド４２−１により、レスポンス処理を持つオブジェクト４３−２を生成する生成関数４６の関数ポインタ４７がリクエストに付加されて送信されるとともに、クライアントプログラム４０′に対してリクエストを送信したことが通知される。
【０１３８】
そして、スレッド４２−１がスレッドプール４１に返却されるとともに、オブジェクト４３−１が破棄される（ステップＴ４，Ｔ５）。
これにより、クライアント処理を実行するスレッド４２−１が終了される。
一方、受信待ちループ処理スレッド４４において、サーバプログラム５０′からレスポンス送信開始を意味するデータを受信した場合は（ステップＴ６のＮｏルート）、スレッド４４′で実行されるレスポンス受信処理によって、サーバプログラム５０′から送信されたレスポンスが受信される。このとき、スレッド４４によって、レスポンスに付加されたレスポンス処理を持つオブジェクト４３−２を生成する生成関数４６の関数ポインタ４７が取得される（ステップＴ７−１）。
【０１３９】
そして、スレッド４４′によって、取得した関数ポインタ４７から生成関数４６が呼び出され、レスポンス処理を持つオブジェクト４３−２が生成される。（ステップＴ７−２）。
以下、クライアントプログラム４０′は、上述したステップＴ８以降の手順により、生成関数４６により生成したオブジェクト４３−２をスレッド４２−３に関連付けて、レスポンス処理を実行する。
【０１４０】
本変形例においては、上述の手順により、クライアント・サーバ間通信が行なわれる。
このように、本実施形態の一例としての管理部２１−１及び処理部２１−２によれば、上述した第１実施形態と同様の効果が得られる。
また、処理部２１−２によって、レスポンス処理（第２の処理）を持つオブジェクト４３−２を生成する生成関数４６の関数ポインタ４７が、リクエストに付加されてサーバプログラム５０′に送信される。そして、関数ポインタ４７を含むレスポンスを受信後に、処理部２１−２によって、関数ポインタ４７から生成関数４６が呼び出され、レスポンス処理を持つオブジェクト４３−２が生成される。
【０１４１】
これにより、処理部２１−２において、リクエストを送信してからレスポンスを受信するまでの間は、レスポンス処理を持つオブジェクト４３−２を生成せず、記憶部２２の記憶領域が使用されないため、記憶領域の有効活用を図ることができる。
（Ｃ）その他
以上、本発明の好ましい実施形態について詳述したが、本発明は、かかる特定の実施形態に限定されるものではなく、本発明の趣旨を逸脱しない範囲内において、種々の変形、変更して実施することができる。
【０１４２】
例えば、図１〜図７を参照しながら、クライアント・サーバ方式の通信において、クライアント端末２０，２０′がそなえる管理部２１−１及び処理部２１−２における処理について説明したが、これに限られない。
例えば、処理部２１−２は、自身の端末内のＣＰＵが実行する他のスレッド又は他のプログラムに対してリクエストを送信してもよい。この場合、他のスレッド又は他のプログラムは、処理部２１−２から受信したリクエストに対するレスポンスを、処理部２１−２に対して送信する。
【０１４３】
このように、管理部２１−１及び処理部２１−２は、クライアント・サーバ方式の通信にのみ用いられるものではなく、自身の端末内のＣＰＵが実行する他のスレッド又は他のプログラムとの通信においても用いることができる。
そして、クライアント端末２０，２０′のＣＰＵ２１が、マルチスレッドプログラムを実行することにより、これらの管理部２１−１及び処理部２１−２として機能するようになっている。
【０１４４】
なお、これらの管理部２１−１及び処理部２１−２としての機能を実現するためのプログラム（マルチスレッドプログラム）は、例えばフレキシブルディスク，ＣＤ（ＣＤ−ＲＯＭ，ＣＤ−Ｒ，ＣＤ−ＲＷ等），ＤＶＤ（ＤＶＤ−ＲＯＭ，ＤＶＤ−ＲＡＭ，ＤＶＤ−Ｒ，ＤＶＤ＋Ｒ，ＤＶＤ−ＲＷ，ＤＶＤ＋ＲＷ，ＨＤ  ＤＶＤ等），ブルーレイディスク，磁気ディスク，光ディスク，光磁気ディスク等の、コンピュータ読取可能な記録媒体に記録された形態で提供される。そして、コンピュータはその記録媒体からプログラムを読み取って内部記憶装置または外部記憶装置に転送し格納して用いる。また、そのプログラムを、例えば磁気ディスク，光ディスク，光磁気ディスク等の記憶装置（記録媒体）に記録しておき、その記憶装置から通信回線を介してコンピュータに提供するようにしても良い。
【０１４５】
管理部２１−１及び処理部２１−２としての機能を実現する際には、内部記憶装置（本実施形態ではクライアント端末２０，２０′の記憶部２２）に格納されたプログラムがコンピュータのマイクロプロセッサ（本実施形態ではクライアント端末２０，２０′のＣＰＵ２１）によって実行される。このとき、記録媒体に記録されたプログラムをコンピュータが読み取って実行するようにしても良い。
【０１４６】
なお、本実施形態において、コンピュータとは、ハードウェアとオペレーティングシステムとを含む概念であり、オペレーティングシステムの制御の下で動作するハードウェアを意味している。また、オペレーティングシステムが不要でアプリケーションプログラム単独でハードウェアを動作させるような場合には、そのハードウェア自体がコンピュータに相当する。ハードウェアは、少なくとも、ＣＰＵ等のマイクロプロセッサと、記録媒体に記録されたコンピュータプログラムを読み取るための手段とをそなえており、本実施形態においては、クライアント端末２０，２０′がコンピュータとしての機能を有しているのである。
（Ｄ）付記
以上の実施形態及び変形例に関し、更に以下の付記を開示する。
（付記１）
複数の処理のうちの少なくとも一の処理に対して複数のスレッドのうちの空スレッドを割り当てる管理部と、該管理部によって該空スレッドが割り当てられた該一の処理を実行する処理部と、をそなえ、
該管理部は、
該処理部によって、該複数の処理のうちの第１の処理からリクエストが送信された場合に、該第１の処理に割り当てられたスレッドを解放して空スレッドにするとともに、該第１の処理を終了させ、
該処理部によって、該リクエストに対するレスポンスが受信されると、該複数の処理のうちの該レスポンスに関する処理を実行する第２の処理に対して空スレッドを割り当てることを特徴とする、マルチスレッド処理装置。
（付記２）
該処理部は、該第２の処理を識別するための識別情報を付加して、該リクエストを送信し、
該管理部は、該リクエストに付加された該識別情報を該リクエストの送信先により付加された該レスポンスが、該処理部によって受信されると、該処理部が受信した該レスポンスに付加された該識別情報に基づいて、該第２の処理に対して空スレッドを割り当てることを特徴とする、付記１記載のマルチスレッド処理装置。
（付記３）
該識別情報は、該第２の処理を持つオブジェクトの先頭アドレスであることを特徴とする、付記２記載のマルチスレッド処理装置。
（付記４）
該識別情報は、該第２の処理を持つオブジェクトを生成する関数の関数ポインタであることを特徴とする、付記２記載のマルチスレッド処理装置。
（付記５）
該管理部は、該複数のスレッドを予め生成し管理するスレッドプールをそなえることを特徴とする、付記１〜４のいずれか１項記載のマルチスレッド処理装置。
（付記６）
該処理部が、該リクエストを送信する前に、
該管理部は、受信待ちスレッドとして、該リクエストに対する該レスポンスを受信する処理を該空スレッドに割り当てるとともに、
該処理部は、該受信待ちスレッドにより該レスポンスを受信する処理を開始することを特徴とする、付記１〜５のいずれか１項記載のマルチスレッド処理装置。
（付記７）
該処理部及び該管理部は、ＣＰＵにそなえられ、
該処理部は、該ＣＰＵが実行する他のスレッド又は他のプログラムに対して該リクエストを送信し、
該他のスレッド又は他のプログラムは、該処理部から受信した該リクエストに対する該レスポンスを、該処理部に対して送信することを特徴とする、付記１〜６のいずれか１項記載のマルチスレッド処理装置。
（付記８）
付記１〜６のいずれか１項記載のマルチスレッド処理装置と、該マルチスレッド処理装置と相互に通信可能に接続された他の装置と、をそなえるマルチスレッド処理システムであって、
該処理部は、該他の装置に対して該リクエストを送信し、
該他の装置は、該処理部から受信した該リクエストに対する該レスポンスを、該マルチスレッド処理装置に対して送信することを特徴とする、マルチスレッド処理システム。
（付記９）
複数の処理のうちの少なくとも一の処理に対して複数のスレッドのうちの空スレッドを割り当てる管理部、および、該管理部によって該空スレッドが割り当てられた該一の処理を実行する処理部、として、コンピュータを機能させるマルチスレッド処理プログラムであって、
該管理部は、
該処理部によって、該複数の処理のうちの第１の処理からリクエストが送信された場合に、該第１の処理に割り当てられたスレッドを解放して空スレッドにするとともに、該第１の処理を終了させ、
該処理部によって、該リクエストに対するレスポンスが受信されると、該複数の処理のうちの該レスポンスに関する処理を実行する第２の処理に対して空スレッドを割り当てるように、
該コンピュータを機能させることを特徴とする、マルチスレッド処理プログラム。
（付記１０）
該処理部は、該第２の処理を識別するための識別情報を付加して、該リクエストを送信し、
該管理部は、該リクエストに付加された該識別情報を該リクエストの送信先により付加された該レスポンスが、該処理部によって受信されると、該処理部が受信した該レスポンスに付加された該識別情報に基づいて、該第２の処理に対して空スレッドを割り当てるように、
該コンピュータを機能させることを特徴とする、付記９記載のマルチスレッド処理プログラム。
（付記１１）
該識別情報は、該第２の処理を持つオブジェクトの先頭アドレスであることを特徴とする、付記１０記載のマルチスレッド処理プログラム。
（付記１２）
該識別情報は、該第２の処理を持つオブジェクトを生成する関数の関数ポインタであることを特徴とする、付記１０記載のマルチスレッド処理プログラム。
（付記１３）
該管理部は、該複数のスレッドを予め生成し管理するスレッドプールをそなえることを特徴とする、付記９〜１２のいずれか１項記載のマルチスレッド処理プログラム。
（付記１４）
該処理部が、該リクエストを送信する前に、
該管理部は、受信待ちスレッドとして、該リクエストに対する該レスポンスを受信する処理を該空スレッドに割り当てるとともに、
該処理部は、該受信待ちスレッドにより該レスポンスを受信する処理を開始するように、
該コンピュータを機能させることを特徴とする、付記９〜１３のいずれか１項記載のマルチスレッド処理プログラム。
（付記１５）
複数の処理のうちの少なくとも一の処理に対して複数のスレッドのうちの空スレッドを割り当てて、該空スレッドが割り当てられた該一の処理を実行するマルチスレッド処理方法であって、
該複数の処理のうちの第１の処理からリクエストが送信された場合に、該第１の処理に割り当てられたスレッドを解放して空スレッドにするとともに、該第１の処理を終了させ、
該リクエストに対するレスポンスが受信されると、該複数の処理のうちの該レスポンスに関する処理を実行する第２の処理に対して空スレッドを割り当てることを特徴とする、マルチスレッド処理方法。
【符号の説明】
【０１４７】
１０，１００  クライアント・サーバ間通信システム
２０，２００    クライアント端末
２１，２１０，３１，３１０    ＣＰＵ
２１−１，３１−１    管理部
２１−２，３１−２    処理部
２２，２２０，３２，３２０    記憶部
２３，２３０，３３，３３０    送受信部
２５，２５０    ネットワーク
３０，３００    サーバ端末
４０，４００    クライアントプログラム
４１，４１０    スレッドプール
４２−１〜４２−３，４２０−１〜４２０−３    スレッド
４３−１，４３−２，４３０    オブジェクト
４４，４４０    受信待ちループ処理スレッド
４５    先頭アドレス
４６    オブジェクト生成関数
４７    関数ポインタ
５０，５００    サーバプログラム
５４，５４０    サーバプログラム側スレッド
【図１】
0005408353.tif 000002
【図２】
0005408353.tif 000003
【図３】
0005408353.tif 000004
【図４】
0005408353.tif 000005
【図５】
0005408353.tif 000006
【図６】
0005408353.tif 000007
【図７】
0005408353.tif 000008
【図８】
0005408353.tif 000009
【図９】
0005408353.tif 000010
【図１０】
0005408353.tif 000011
【図１１】
0005408353.tif 000012