(57)【特許請求の範囲】
【請求項１】
複数のスレッドを並行して実行可能なマルチスレッドプログラムからシングルスレッドプログラムを呼出して実行するマルチスレッド処理装置に於いて、
前記マルチスレッドプログラムの特定の１スレッドにより前記シングルスレッドプログラムを最初に呼出して実行する際に生成され、前記シングルスレッドブログラムを呼出す唯一の呼出専用スレッドを備え、
該呼出専用スレッドは、前記マルチスレッドプログラムで生成した最上位スレッド（ルートスレッド又はメインスレッド）のグループに属すことで、前記最上位スレッドの終了に同期して終了し、
前記マルチスレッドプログラムのスレッドは、前記シングルメソッドプログラムのメソッドプロトタイプ又はメソッドに対応して前記読出専用スレッドの必要の有無を記述した環境定義テーブル、又はユーザ指定に基づいて、前記呼出専用スレッドが必要か否かを判定することを特徴とするマルチスレッド処理装置。
【請求項２】
請求項１記載のマルチスレッド処理装置に於いて、前記呼出専用スレッドは、前記マルチスレッドプログラムで生成された複数のスレッドから呼出された順に前記シングルスレッドプログラムを呼出すことを特徴とするマルチスレッド処理装置。
【請求項３】
請求項２記載のマルチスレッド処理装置に於いて、前記呼出専用スレッドは、前記マルチスレッドプログラムのスレッドの呼出要求として投入される同期イベントを格納する先入れ先出し構成（FIFO構成）のイベントキューを備え、前記イベントキューから同期イベントを順番に取出して前記シングルスレッドプログラムを実行することを特徴とするマルチスレッド処理装置。
【請求項４】
請求項１記載のマルチスレッド処理装置に於いて、前記呼出専用スレッドのイベントキューに投入される同期イベントは、呼出すシングルスレッドプログラムを特定するための情報として、少なくともメソッド名及び呼出元スレッドＩＤを格納したレコードであることを特徴とするマルチスレッド処理装置。
【請求項５】
請求項１記載のマルチスレッド処理装置に於いて、前記マルチスレッドプログラムのスレッドは、前記シングルスレッドプログラムを呼出す際に前記呼出専用スレッドが必要か否か判定し、必要とする場合は前記呼出専用スレッドを使用して呼出し、必要としない場合は前記シングルスレッドプログラムを直接呼出すことを特徴とするマルチスレッド処理装置。
【請求項６】
複数のスレッドを並行して実行可能なマルチスレッドプログラムからシングルスレッドプログラムを呼出して実行するマルチスレッド処理方法に於いて、
前記マルチスレッドプログラムの特定の１スレッドにより前記シングルスレッドプログラムを最初に呼出して実行する際に、前記シングルスレッドブログラムを呼出す唯一の呼出専用スレッドを生成し、生成後は前記呼出専用スレッドを使用して前記シングルスレッドプログラムを呼出し、
該呼出専用スレッドは、前記マルチスレッドプログラムで生成した最上位スレッド（ルートスレッド又はメインスレッド）のグループに属すことで、前記最上位スレッドの終了に同期して終了し、
前記マルチスレッドプログラムのスレッドは、前記シングルメソッドプログラムのメソッドプロトタイプ又はメソッドに対応して前記読出専用スレッドの必要の有無を記述した環境定義テーブル、又はユーザ指定に基づいて、前記呼出専用スレッドが必要か否かを判定することを特徴とするマルチメソッド処理方法。
【請求項７】
コンピュータに、
マルチスレッドプログラムの特定の１スレッドによりシングルスレッドプログラムを最初に呼出して実行する際に生成され、前記シングルスレッドブログラムを呼出す唯一の呼出専用スレッドを実行させるための手順、
該呼出専用スレッドが、前記マルチスレッドプログラムで生成した最上位スレッド（ルートスレッド又はメインスレッド）のグループに属すことで、前記最上位スレッドの終了に同期して終了させる手順、
前記マルチスレッドプログラムのスレッドが、前記シングルメソッドプログラムのメソッドプロトタイプ又はメソッドに対応して前記読出専用スレッドの必要の有無を記述した環境定義テーブル、又はユーザ指定に基づいて、前記呼出専用スレッドが必要か否かを判定する手順、
を実行させるためのプログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、複数のスレッドを並行して実行するマルチスレッドプログラムからシングルスレッドプログラムを呼出して実行するマルチスレッド処理装置、処理方法並びにマルチスレッド処理プログラムを格納したコンピュータ可読の記録媒体に関し、特に、複数のスレッドによる同じシングルスレッドプログラムの呼出しを保証するマルチスレッド処理装置、処理方法並びにマルチスレッド処理プログラムを格納したコンピュータ可読の記録媒体に関する。
【０００２】
【従来の技術】
従来、Hot Java等のマルチスレッドで動作するプログラム、所謂マルチスレッドプログラムにあっては、あるスレッドの処理が動的ライブラリとして存在する既存のＣＯＢＯＬ等のシングルスレッドプログラムを使用した方が速いような場合、マルチスレッドプログラムから既存のシングルスレッドプログラムを呼出して動作させる。
【０００３】
図１３は、遠隔メソッド起動ＲＭＩ(Remote Method Invocation ）を用いてサーバ上のマルチスレッドプログラムで既存のＣＯＢＯＬプログラムを呼出して実行する場合である。
【０００４】
マルチスレッドプログラムとして動作するＲＭＩサーバアプリケーション１００は、クライアント１２０−１，１２０−２からのメソッド呼出し（ＲＭＩ呼出）を受け付けると、メインスレッドとしてのルートスレッド１１４を生成した後に、呼出毎にスレッド１１６−１，１１６−２を生成して実行する。
【０００５】
このようにＲＭＩサーバアプリケーション１００は、メソッド呼出しを受けて複数のスレッドを生成し、これらを並列的に実行することから、必ずマルチスレッドプログラムとして動作することになる。
【０００６】
ここでユーザはスレッド１１６−１，１１６−２の生成を制御することはできない。このためスレッド１１６−１，１１６−２は、任意に既存資産としてのＣＯＢＯＬプログラム等で記述されたシングルスレッドプログラム１１８を呼び出して実行する。
【０００７】
【発明が解決しようとする課題】
しかしながら、マルチスレッドプログラムからシングルスレッドプログラムを呼出して実行する場合には、次の問題点がある。
【０００８】
まずシングルスレッドプログラム１１８では、１プロセスに１スレッドしかないことを前提に静的変数のような資源を使っている場合がある。このようなシングルスレッドプログラム１１８を複数のスレッドがアクセスするマルチスレッドで動作させると、静的変数のような資源へのアクセスが競合し、シングルスレッドプログラムが異常動作する場合がある。
【０００９】
図１４は、図１３のスレッド１１６−１，１１６−２の関数によりシングルスレッドプログラムの静的変数をアクセスした場合の問題を示す。図１３のスレッド１１６−１，１１６−２は、非同期に並列に実行され、それぞれシングルスレッドプログラム１１８を呼出すものとする。
【００１０】
このときスレッド１１６−１，１１６−２の関数「wrap f1(args) 」、「wrap f2(args) 」によりシングセルスレッドプログラム１１８の静的変数「ptr 」ををアクセスしている。例えばスレッド１１６−１による呼出しで、図１４の主記憶１３０の割当てられたプロセス領域１３２のスレッド対応領域１３４−１のf(1)内でデータ領域１３６の中に静的変数ptr のメモリ領域１３８を割当て、この静的変数ptr に割当てた領域１３８にアクセスし、f1()が復帰する前にその領域１３８を開放する。
【００１１】
スレッド１１６−２による呼出しでも、同様にスレッド対応領域１３４−２のf2()内で静的変数ptr にメモリ領域１３８を割当て、この静的変数ptr に割当てた領域１３８にアクセスし、f2()が復帰する前にその領域１３８を開放する。
【００１２】
スレッド１１６−１，１１６−２からのシングルスレッドプログラム１１８の実行は非同期であるため、関数f1()とf2()による静的変数ptr のアクセスも非同期に並列して実行される。このためスレッド１１６−１の関数f1()で静的変数ptr にメモリ領域１３８を割当てた直後に、スレッド１１６−２の関数f2()が再び静的変数ptr にメモリ領域１３８を割り当てることが起きる。
【００１３】
このときスレッド１１６−１の関数f1()で静的変数ptr の領域１３８にアクセスした場合、スレッド１１６−２の関数f2()による割当てによって意図した領域ではなくなっており、簡単にメモリオーバーラン等の異常が起こり、プログラムの異常終了につながる。
【００１４】
またシングルスレッドプログラム１１８が複数のスレッド１１６−１，１１６−２で実行された場合、スレッド１１６−１，１１６−２によってシングルスレッドプログラム１１８は呼出した順に実行されるとは限らないので、動作順も保証されない。このため、実行結果が利用者の意図とは異なる場合がある。
【００１５】
図１５は、ブラウザ上で並列に実行されるアプレットから既存資産であるシングルスレッドプログラムを呼出す場合である。クライアント１４２のブラウザ１４４上に生成されたスレッド１１６−１，１１６−２よってＷＷＷサーバ１４０のアプレット１４６−１，１４６−２をダウンロードすると、ブラウザ上で複数のアプレット１４６−１，１４６−２が並列に実行される。
【００１６】
この場合にも、ユーザはアプレット１４６−１，１４６−２の生成を制御できない。このためアプレット１４６−１，１４６−２は、任意に既存資産としてのＣＯＢＯＬプログラム等で記述されたシングルスレッドプログラム１１８を呼び出して実行する。そのため図１４に示した静的変数のような資源へのアクセスが競合し、シングルスレッドプログラムが異常動作する場合がある。
【００１７】
このようなマルチスレッドプログラムから既存のシングルスレッドプログラムを呼出して実行した場合の問題を解決するため、マルチスレッドプログラムからシングルスレッドプログラムを呼出す際に別のプロセスを生成し、その中でシングルスレッドプログラムを実行することが考えられる。しかし、新たなプロセスの生成はデータ領域の生成を伴うことから負荷が大きく、性能が悪い。
【００１８】
また既存のシングルスレッドプログラムをマルチスレッドプログラムに作りなおすことも考えられる。しかし、既存のシングルスレッドプログラムをマルチスレッドプログラムに作りなおすことは、工数がかかり開発効率が悪い。
【００１９】
本発明は、マルチスレッドプログラムによりシングルスレッドプログラムの呼出しを保証して既存資源を有効に利用できるようにしたマルチスレッド処理装置、処理方法並びにマルチスレッド処理プログラムを格納したコンピュータ可読の記録媒体を提供することを目的とする。
【００２０】
【課題を解決するための手段】
図１は本発明の原理説明図である。
【００２１】
本発明は、図１（Ａ）のように、複数のスレッド１６を並行して実行可能なマルチスレッドプログラム１０からシングルスレッドプログラム１８を呼出して実行するマルチスレッド処理装置であり、マルチスレッドプログラム１０の特定の１スレッド１６によりシングルスレッドプログラム１８を最初に呼出して実行する際に生成され、シングルスレッドブログラム１８を呼出す唯一の呼出専用スレッド２０を設けたことを特徴とする。
【００２２】
このようにシングルスレッドプログラムをマルチスレッドプログラム内に生成した常に同じ呼出専用スレッドから呼出す仕組みを設けたことで、シングルスレッドプログラムが静的変数のような資源を使用していた場合でも、資源に対する複数のスレッドからのアクセスが競合することがない。
【００２３】
またマルチスレッドプログラムからシングルスレッドプログラムを呼出す際に新たに別プロセスを生成しないで済むため、実行性能が向上する。更に、マルチスレッドプログラムからシングルスレッドプログラムを呼出す際に、シングルスレッドプログラムをマルチスレッドプログラムに作り直す必要がないため、開発効率が向上する。
【００２４】
呼出専用スレッド２０は、マルチスレッドプログラム１０で生成された複数のスレッド１６から呼出された順にシングルスレッドプログラム１８を呼出す。このためマルチスレッドプログラム内の複数のスレッドが呼出した順でシングルスレッドプログラムが実行され、ユーザの意図した実行結果が得られる。
【００２５】
呼出専用スレッド２０は、マルチスレッドプログラム１０のスレッド１６からの呼出要求として投入される同期イベントを格納する先入れ先出し構成(FIFO 構成）のイベントキュー２６を備え、イベントキュー２６から同期イベントを順番に取出してイングルスレッドプログラム１８を実行する。
【００２６】
呼出専用スレッド２０のイベントキュー２６に投入される同期イベントは、図１（Ｃ）のように、呼出すシングルスレッドプログラム１８を特定するための情報として、少なくともメソッド名及び呼出元スリッドＩＤを格納したレコードである。尚、レコードにはこれ以外にライブラリ名、メソッドプロトタイプ、復帰値と引数を格納してもよい。
【００２７】
呼出専用スレッド２０は、マルチスレッドプログラム１０で生成した最上位スレッド（ルートスレッド又はメインスレッド）１４のグループに属することで、最上位スレッド１４の終了に同期して終了する。
【００２８】
本発明で生成したシングルスレッドプログラム１８を呼出す唯一の呼出専用スレッド２０は、一度生成されたらプロセスが有効である間存在するが、プロセスの終了時に正しくスレッドが終了させる必要がある。そこで呼出専用スレッド１８を最上位のルートスレッド（メインスレッド）１４と同じスレッドグループに属するようにし、ルートスレッド（メインスレッド）の終了時に呼出専用スレッド２０が終了することを保証する。
【００２９】
ユーザスレッド１６は、シングルスレッドプログラム１８を呼出す際に呼出専用スレッド２０を必要とするか否か判定し、必要とする場合は呼出専用スレッド２０を使用して呼出し、必要としない場合はシングルスレッドプログラム１８を直接呼出す。このためユーザスレッド１６は、シングルスレッドプログラム１８のメソッドプロトタイプ又はメソッドに対応して読出専用スレッドの使用の有無を記述した図１（Ｂ）の環境定義テーブル２２、又はユーザ指定に基づいて、呼出専用スレッドを必要とするか否か判定する。
【００３０】
これはマルチスレッドプログラムからシングルスレッドプログラムを呼ぶ場合に、偶然、問題が発生しないシングルスレッドプログラムの場合があることに対応している。この場合に呼出専用スレッドを使用すると、その分、処理が複雑になり実行性能が落ちる。そこで、問題が発生しないシングルスレッドプログラムの場合には、呼出専用スレッドをバイパスしてシングルスレッドプログラムを直接呼出し、実行性能を向上させる。
【００３１】
本発明は、複数のスレッドを並行して実行可能なマルチスレッドプログラムからシングルスレッドプログラムを呼出して実行するプログラム処理方法を提供するものであり、マルチスレッドプログラムの特定の１スレッドによりシングルスレッドプログラムを最初に呼出して実行する際に、シングルスレッドブログラムを呼出す唯一の呼出専用スレッドを生成し、生成後は呼出専用スレッドを使用して前記シングルスレッドプログラムを呼出すことを特徴とする。
【００３２】
また本発明は、複数のスレッドを並行して実行可能なマルチスレッドプログラムからシングルスレッドプログラムを呼出して実行するスレッド処理プログラムを格納したコンピュータ可読の記録媒体を提供するものであり、マルチスレッド処理プログラムに、マルチスレッドプログラムの特定の１スレッドによりシングルスレッドプログラムを最初に呼出して実行する際に生成され、シングルスレッドブログラムを呼出す唯一の呼出専用スレッドを設けたことを特徴とする。
【００３３】
【発明の実施の形態】
図２は、本発明によるマルチスレッド処理装置の実施形態であり、遠隔メソッド呼出し（ＲＭＩ）を用いてサーバアプリケーションのマルチスレッドプログラムを実行する場合を例にとっている。
【００３４】
図２において、マルチスレッドプログラムとして機能するＲＭＩサーバアプリケーション１０は、プログラムの起動時にメインスレッドとして動作するルートスレッド１４を形成し、クライアント１２−１，１２−２からのメソッド呼出しであるＲＭＩ呼出しを受け付ける。
【００３５】
ルートスレッド１４は、クライアント１２−１，１２−２からＲＭＩ呼出しを受け付けるごとに例えばスレッド１６−１，１６−２を生成し、スレッド１６−１，１６−２はそれぞれ並列に実行されることでマルチスレッド動作を行う。
【００３６】
スレッド１６−１，１６−２は、既存の資源として存在する動的ライブラリとしてのシングルスレッドプログラム１８を利用する場合がある。既存資産としてのシングルスレッドプログラム１８は、例えばＣＯＢＯＬプログラム等で記述されたデータベース等であり、ＲＭＩサーバアプリケーション１０で実現されるマルチスレッドプログラムのプロセスに対し、別プロセスとして存在している。
【００３７】
本発明にあっては、スレッド１６−１，１６−２でシングルスレッドプログラム１８を呼び出す場合に、原則として呼出専用スレッド２０を生成する。ここでスレッド１６−１，１６−２の２つが並列に実行されている場合、呼出専用スレッド２０を生成するのは、プログラムの実行順に従って最初にシングルスレッドプログラム１８を呼び出す方のスレッドである。
【００３８】
スレッド１６−１または１６−２により生成された呼出専用スレッド２０は、ＦＩＦＯ構成のイベントキュー２６を内蔵している。スレッド１６−１，１６−２でシングルスレッドプログラム１８を呼び出そうとする場合、各スレッドは同期イベントを生成し、呼出スレッド２０のイベントキュー２６に投入する。このスレッド１６−１，１６−２がシングルスレッドプログラム１８の呼出しのために生成する同期イベントは
▲１▼シングルスレッドプログラムを実行するために必要な関数名や引数情報等の情報；
▲２▼動作対象とするメソッド（シングルスレッドプログラム）の識別情報を含むイベント；
を備える。
【００３９】
呼出専用スレッド２０のイベントキュー２６は、ＦＩＦＯ構成であることから、イベントキュー２６にキューイングされている同期イベントを先頭から取り出し、取り出した同期イベントに含まれる情報に基づいてシングルスレッドプログラム１８を実行する。
【００４０】
シングルスレッドプログラム１８の実行が終了すると、呼出専用スレッド２０に対し関数が復帰するので、この関数復帰を受けて呼出専用スレッド２０は同期イベントを投入したスレッド１６−１または１６−２へのシングルスレッドプログラム１８の実行終了を通知する。
【００４１】
このように呼出専用スレッド２０を生成し、そのイベントキュー２６にスレッド１６−１，１６−２からシングルスレッドプログラム１８の呼出しを行った順に同期イベントを投入し、投入した順番に従ってシングルスレッドプログラム１８を実行するため、シングルスレッドプログラム１８の変数のアクセスが競合することがない。
【００４２】
例えばスレッド１６−１，１６−２の順番にシングルスレッドプログラム１８の呼出しのための同期イベントを呼出専用スレッド２０に投入し、このときの関数４８−１，４８−２がシングルスレッドプログラム１８の静的変数５０を利用していたとしても、呼出専用スレッド２０はスレッド１６−１の同期イベントに基づくシングルスレッドプログラム１８の実行を終了した後に、スレッド１６−２から投入した同期イベントに基づくシングルスレッドプログラム１８の実行を行うことになる。
【００４３】
この結果、複数のスレッド１６−１，１６−２がシングルスレッドプログラム１８を呼び出していても、その静的変数５０に同時にアクセスするスレッドは１つに限定されるため、資源の競合の問題は発生しない。
【００４４】
図３は、スレッド１６−１，１６−２の変数４８−１，４８−２でシングルスレッドプログラム１８の静的変数５０をアクセスした場合の主記憶３０のプロセス領域３２であり、プロセス領域３２にはまずスレッド１６−１の対応領域３４−１が確保され、ｆ１（args）内で静的変数ptr にメモリ領域３８を割り当て、静的変数ptr に割り当てた領域にアクセスし、ｆ１（args）が復帰する前に領域３８を開放する。
【００４５】
このようにしてスレッド１６−１からの呼出しによるシングルスレッドプログラム１８が終了すると、続いてスレッド１６−２からの呼出しによるシングルスレッドプログラム１８の実行でスレッド１６−２の対応領域３８−２のｆ２（args）内で静的変数ptr にメモリ領域３８を割り当て、静的変数ptr に割り当てた領域３８にアクセスし、ｆ２（args）が復帰する前に領域３８を開放する。
【００４６】
したがって、スレッド１６−１，１６−２によるシングルスレッドプログラム１８の呼出しによる静的変数５０のアクセスは順番に行われるため、図１４に示したような従来の直接複数のスレッドからシングルスレッドプログラムを呼び出して静的変数のアクセスで競合する問題が起きることはない。
【００４７】
再び図２を参照するに、スレッド１６−１，１６−２で呼び出す別プロセスのシングルスレッドプログラム１８の中には、複数のスレッドの呼出しで実行させるマルチスレッド動作を行っても問題を起こさないものがある。このようにマルチスレッド動作で呼び出しても問題が起きないシングルスレッドプログラムについては、呼出専用スレッド２０を使用して呼び出すと、その分アクセス性能が低下する。
【００４８】
そこで本発明にあっては、スレッド１６−１，１６−２でシングルスレッドプログラム１８を呼び出す際に、シングルスレッドプログラム１８がマルチスレッド動作で問題が起きずに呼出専用スレッド２０を必要としないシングルスレッドプログラムか、マルチスレッド動作で問題を起こし呼出専用スレッド２０を必要とするシングルスレッド動作しかできないシングルスレッドプログラムであるかを判定し、シングルスレッド動作を必要とする場合には呼出専用スレッド２０により呼び出し、マルチスレッド動作ができる場合には呼出専用スレッド２０をバイパスして直接シングルスレッドプログラム１８を呼び出すようにする。
【００４９】
このようにスレッド１６−１，１６−２でシングルスレッドプログラム１８の呼出しに呼出専用スレッドを必要とするか否かの判定は
▲１▼ユーザ指定、
▲２▼環境定義テーブルの参照
のいずれかとする。
【００５０】
ユーザ指定は、呼出対象とするシングルスレッドプログラムがマルチスレッドによる呼出しを受けても問題ないことが予め判っている場合に行う。また環境定義テーブル２２には、動作対象とするシングルスレッドプログラム１８の識別情報に加えて呼出専用スレッド２０を必要とするか否かの情報が含ませておき、スレッド１６−１が環境定義テーブル２２を参照することで、呼出そうとするシングルスレッドプログラム１８を環境定義テーブル２２を参照することで、呼出専用スレッド２０を必要とするか否かが認識できる。
【００５１】
更に図２のＲＭＩサーバアプリケーション１０にあっては、スレッド１６−１または１６−２でシングルスレッドプログラム１８を呼び出す際に生成した呼出専用スレッド２０をルートスレッド１４に同期して終了させるため、呼出専用スレッド２０をルートスレッド１４のルートスレッドグループに属させている。
【００５２】
これは、呼出専用スレッド２０をＲＭＩサーバアプリケーション１０のマルチスレッドプログラムの１プロセスにおいて別のプロセスのシングルスレッドプログラム１８を呼び出す唯一のスレッドとして発生しており、唯一のスレッドとして機能させるためにはルートスレッド１４と同じスレッドグループに属するようにし、ルートスレッド１４の終了時即ちメインプログラムの終了時に呼出専用スレッド２０が終了することを保証する。
【００５３】
即ちルートスレッド１４のグループに呼出専用スレッド２０を属させておくことで、ルートスレッド１４が終了する際に同じスレッドグループである呼出専用スレッド２０にも終了が通知され、これによって呼出専用スレッドをルートスレッド１４に同期して正しく終了させることができる。
【００５４】
これに対し、もしスレッド１６−１，１６−２の終了に同期して呼出専用スレッド２０を終了させた場合には、終了後に新たにシングルスレッドプログラム１８を呼び出す際に別の呼出専用スレッド２０が生成されることとなり、複数の呼出専用スレッド２０が存在することで、シングルスレッドプログラム１８を呼び出すスレッドを唯ひとつに絞るという本発明の機能が果たせなくなる。
【００５５】
したがって、呼出専用スレッド２０は、ルートスレッド１４のグループに属させておくことでＲＭＩサーバアプリケーション１０によるマルチスレッドプログラムのプロセスに唯一のスレッドとして存在するようにしている。
【００５６】
図４は、図２のＲＭＩサーバアプリケーション１０に設けた環境定義テーブル２２の説明図である。図４において、環境定義テーブル２２は、動作対象メソッドとなるシングルスレッドプログラム１８を識別するためのライブラリ名５２、メソッド名５４、メソッドプロトタイプ５６で構成され、更に呼出専用スレッド２０を必要とするか否かを判別するためのモード５８を登録している。
【００５７】
ここでモード５８は呼出専用スレッド２０を必要とするシングルモードと、呼出専用スレッド２０を必要とせずにバイパスするマルチモードが設定されている。即ちシングルモードとは、唯一のスレッドによる呼出しでシングルスレッドプログラム１８を実行しなければ問題を起こす場合であり、これに対しマルチモードとは複数のスレッドの並列動作でシングルスレッドプログラム１８を呼び出しても問題を起こさない場合である。
【００５８】
動作対象とするシングルスレッドプログラム１８を識別する情報は、ライブラリ名５２、メソッド名５４及びメソッドプロトタイプ５６であり、メソッドプロトタイプ５６は復帰値の型と引数の型の並びを表わしており、図示のようにアルファベットの並びで表現することができる。このようにメソッドプロトタイプ５６がアルファベットの並びで表現できるのは、ＪａｖａのＪＮＩ（Java Native Interface）で使用されているものである。
【００５９】
即ち、ＪＮＩでは、メソッドの任意のプロトタイプを文字列で表現でき、例えば、
int          :  'i'
pointer      :  'p'
structure    :  's'
というように文字を割当ることができる。
【００６０】
また動作対象となるメソッド、即ちシングルスレッドプログラム１８を識別するための情報としてメソッド名５４以外にメソッドプロトタイプ５６を持つ理由は、同一ライブラリの中にプロトタイプが異なる同じ名前のメソッドの存在を許しているシステムがあるためである。
【００６１】
環境定義テーブル２２を作成する場合、利用者は、予め与えられた別の情報から、そのメソッドがマルチスレッド・セーフか否か判断した上で、環境情報テーブル２２のモードを指定する。マルチスレッド・セーフか否かの判断は、ソースコードの解析結果、マルチスレッドでの動作を保証しているライブラリのメソッド等に基づいて行う。
【００６２】
この図４の環境定義テーブル２２は、図２のスレッド１６−１または１６−２がシングルスレッドプログラム１８を呼び出す際に前もって参照され、呼出対象メソッド名に対応するモードから、もしシングルモードであれば呼出専用スレッド２０を使用してシングルスレッドプログラム１８を呼び出し、マルチモードであれば直接シングルスレッドプログラム１８を呼び出す。
【００６３】
尚、環境定義テーブル２２の識別情報としては、少なくともメソッドプロトタイプ５６又はメソッド名５４でよい。
【００６４】
図５（Ａ）は図２の呼出専用スレッド２０に設けられたイベントキュー２６の格納状態であり、呼出専用スレッド２０が参照するシングルスレッドプログラム１８を動作対象とした識別情報テーブルとして機能する。
【００６５】
図５（Ａ）のイベントキュー２８には、呼出メソッドを特定する情報として、ライブラリ名５２、メソッド名５４、メソッドプロトタイプ５６及び復帰値・引数（配列）６０が格納されている。更に呼出元のスレッドを特定するための呼出元スレッドＩＤ６２を設けている。この呼出元スレッドＩＤ６２は、Ｊａｖａの場合はスレッドの参照（ポインタ）を使用する。
【００６６】
復帰値・引数（配列）６０には、シングルスレッドプログラム１８を実行するのに必要な復帰値及び引数の値を設定する。この復帰値及び引数の値はＪａｖａではオブジェクトの配列の形式で設定する。また復帰値及び引数の値は直値の場合と構造体等へのポインタの場合があるが、どの要素が直値でどの要素が構造体等へのポインタであるかはメソッドプロトタイプ５６から判断する。
【００６７】
更に呼出専用スレッド２０の呼出しで実行されたシングルスレッドプログラム１８の実行結果として復帰値や引数の領域に値が帰ってきた場合、復帰値・引数（配列）６０の領域に値を設定し、呼出元スレッドＩＤで指定されるスレッドに値を返してマルチスレッドプログラム１８の終了を通知する。
【００６８】
この図５（Ａ）のイベントキュー２８にあっては、スレッドにより投入された３つの同期イベント２８−１，２８−２，２８−３が投入順に従って上から下に配列された場合である。
【００６９】
このため、図２のスレッド１６−１，１６−２から呼出専用スレッド２０のイベントキュー２６に投入される同期イベント２８は、図５（Ｂ）に取り出して示すように、ライブラリ名５２、メソッド名５４、メソッドプロトタイプ５６、復帰値・引数（配列）６０及び呼出元スレッドＩＤ６２を１レコードとした情報である。
【００７０】
このうち、呼出メソッドを特定するための情報であるライブラリ名５２、メソッド名５４及びメソッドプロトタイプ５６は、図４に示した環境定義テーブル２２の参照で取得することができ、復帰値・引数（配列）６０及び呼出元スレッドＩＤ６２はシングルスレッドプログラム１８を呼び出そうとするスレッド１６−１，１６−２自身で生成されるパラメータである。尚、同期イベント２８は、少なくともメソッド名５４と呼出元メソッド名６２を格納するものであればよい。
【００７１】
図６は、図２の呼出専用スレッド２０のイベントキュー２６に投入された同期イベントの他の格納状態であり、この実施形態にあっては図５の同期イベントに更に動作対象とするメソッドのグループに関する情報と優先度を設けたことを特徴とする。
【００７２】
図６（Ａ）は、イベントキュー２８に４つの同期イベント２８−１〜２８−４が投入された状態であり、ライブラリ名５２、メソッド名５４、メソッドプロトタイプ５６、復帰値・引数（配列）６０、呼出元スレッドＩＤ６２に加えて、グループ６４と優先度６６を設けている。
【００７３】
ここで順番に投入した４つの同期イベント２８−１〜２８−４のうち、２番目と４番目の同期イベント２８−２，２８−４はグループが「ＵＩ」と同じであり、優先度がそれぞれ異なる「−１」と「＋１」を設定している。
【００７４】
このようにグループ６４と優先度６６を設けた同期イベント２８−２，２８−４については、同期イベント２８−４が一番下に新たにキューイングされたタイミングで、同一グループの同期イベント２８−２があることから両者の優先度で比較し、図６（Ｂ）のように優先度の高い同期イベント２８−４を上から２番目の位置に置き換え、優先度の低い同期イベント２８−２を４番目の位置に並べ換える。
【００７５】
これによって呼出対象が同じグループのメソッド、即ちシングルスレッドプログラムであった場合には、優先度の高い同期イベントをイベントキューの高い位置に並び換えることで、優先度が高いほどグループ内で優先的にシングルスレッドプログラムを呼び出して実行することができるように制御できる。
【００７６】
次に図２のＲＭＩサーバアプリケーション１０によるマルチスレッド処理を図７乃至図１０のフローチャートを参照して説明する。
【００７７】
図７は、ＲＭＩサーバアプリケーション１０におけるマルチスレッド処理の全体的な処理動作のフローチャートである。まずＲＭＩサーバアプリケーション１０として提供されるマルチスレッドプログラムを起動すると、ステップＳ１でルートスレッド１４が生成される。
【００７８】
ルートスレッド１４に対しては、ステップＳ２でクライアント１２−１，１２−２より遠隔メソッド起動ＲＭＩによるメソッド呼出しが行われ、このメソッド呼出しを受けると、ステップＳ３でユーザスレッドとして例えばスレッド１６−１を生成する。続いてステップＳ４で現在生成しているスレッドを並列的に実行する処理を行い、ステップＳ５でルートメソッドの終了があるまで、ステップＳ２からの処理を繰り返す。
【００７９】
このためルートスレッド１４は、クライアント１２−１，１２−２からＲＭＩ呼出しによるメソッド呼出しを受けるごとにスレッドを生成して処理を並列的に実行する。ステップＳ５でルートスレッドの終了が判別されると、ステップＳ６に進み、ルートスレッド自身の処理を終了すると同時に、ルートスレッドグループに属する他のスレッドに終了を通知してマルチスレッド処理を終了させる。
【００８０】
図８は、図７のステップＳ３で生成したユーザスレッドの生成実行処理のフローチャートである。まずステップＳ１でルートスレッド１４がＲＭＩ呼出しによるメソッド呼出しを受けてユーザスレッド例えばユーザスレッド１６−１を生成し、ステップＳ２で生成したユーザスレッド１６−１を含む複数のスレッドの処理を並列的に行う。
【００８１】
次にステップＳ３でユーザスレッド１６−１においてシングルスレッドプログラム１８の呼出実行か否かチェックする。シングルスレッドプログラム１８の呼出実行であれば、ステップＳ４に進み、環境定義テーブル２２を参照し、動作対象とするスレッド名からそのモードを読み取ることで、シングルモード即ちシングルスレッド動作を必要とするか否かチェックする。
【００８２】
環境定義テーブル２２の参照でシングルスレッド動作、即ち呼出専用スレッドを必要とする場合には、ステップＳ５に進み、既に呼出専用スレッド２０が生成されているか否かチェックする。もし呼出専用スレッド２０が生成されていなければ、ステップＳ６で呼出専用スレッド２０を生成する。
【００８３】
次にステップＳ７でスレッド１６−１は同期イベントを生成し、呼出専用スレッド２０のイベントキュー２６に投入し、ステップＳ８で同期イベント終了待ちとなる。ステップＳ８において、シングルスレッドプログラム１８の実行終了で関数や引数の復帰に伴い同期イベントの終了を受けると、ステップＳ９に進み、スレッド終了の有無をチェックし、スレッド終了でなければ再びステップＳ２に戻り、スレッド１６−１の処理を続行する。
【００８４】
一方、ステップＳ４で外部のシングルスレッドプログラム１８の呼出実行のために環境定義テーブル２２を参照し、シングルスレッド動作を必要としない即ち呼出専用スレッドを必要としないマルチモードであった場合には、ステップＳ５〜Ｓ８の処理を行わず、ステップＳ１０にバイパスし、呼出専用スレッド２０を使用せずに直接外部のシングルスレッドプログラムを呼び出して実行し、ステップＳ１１で終了通知を待って、再びステップＳ２の処理に戻る。
【００８５】
この図８のユーザスレッド生成実行処理は、図２に示したスレッド１６−１，１６−２のそれぞれの処理として並列的に実行されている。
【００８６】
図９は、図８のステップＳ６で行われる呼出専用スレッド２０の生成処理のフローチャートである。この呼出専用スレッド２０の生成処理は、ステップＳ１で生成元のスレッド例えば最初にシングルスレッドプログラム１８を呼び出そうとしたスレッド１６−１を現在のスレッドとして取得し、ステップＳ２で現在のスレッド１６−１のスレッドグループを取得する。
【００８７】
次にステップＳ３で現在のスレッドグループに親スレッドグループがあるか否かチェックする。図２の場合には、スレッド１６−１に対しルートスレッド１４の親スレッドグループがあることから、ステップＳ４に進み、親スレッドグループを現在のスレッドグループとする。
【００８８】
そして再びステップＳ３に戻り、現在のスレッドグループとしたルートスレッドグループに親スレッドグループがあるか否かチェックする。この場合には親スレッドグループがないことから、ステップＳ５に進み、呼出専用スレッド２０を生成し、生成した呼出専用スレッドを現在のスレッドグループ即ち、ステップＳ３，Ｓ４の処理で特定された最上位の親スレッドグループ即ちルートスレッドグループに追加する。この図９の処理によって生成された呼出専用スレッド２０は、ルートスレッド１４として動作することになる。
【００８９】
図１０は、図２でシングルスレッドプログラム１８を呼出すために唯一生成した呼出専用スレッド２０の処理動作のフローチャートである。この呼出専用スレッド２０の処理にあっては、まずステップＳ１でスレッド１６−１，１６−２からのシングルスレッドプログラム１８の呼出しを行うための同期イベントの受領をチェックしており、同期イベントを受領すると、ステップＳ２でイベントキュー２６に受領順に同期イベントを格納する。
【００９０】
次にステップＳ３でイベントキュー２６が空か否かチェックしており、空でなければステップＳ４に進み、イベントキュー２６の先頭の同期イベントを取り出し、ステップＳ５で同期イベントの情報から外部のシングルスレッドプログラム１８を呼び出して実行する。
【００９１】
シングルスレッドプログラム１８の処理が終了すると関数や引数が復帰してくることから、これによってステップＳ６で呼出プログラムの終了を認識し、ステップＳ７で呼出元メソッドに同期イベントの終了を通知する。この同期イベントの終了にはシングルスレッドプログラム１８の終了で復帰した関数や引数の値が含まれている。
【００９２】
更にステップＳ８でルートスレッドからの終了通知をチェックしており、呼出専用スレッド２０は図９の生成処理によってルートスレッド１４のグループに属していることから、ルートスレッドからの終了通知を受けて呼出専用スレッド２０の処理を終了する。
【００９３】
図１１は、本発明によるマルチスレッド処理装置の他の実施形態であり、クライアントのスレッドによってサーバからダウンロードしたアプレットが呼出専用スレッドを使用してシングルスレッドプログラムを呼び出す実施形態を例にとっている。
【００９４】
図１１において、クライアント４２にはブラウザ４４が設けられており、メソッド呼出しによってスレッド１６−１，１６−２が生成される。スレッド１６−１，１６−２はＷＷＷサーバ４０をアクセスし、アプレット４６−１，４６−２をそれぞれダウンロードして並列的に実行する。
【００９５】
このようにブラウザ４４上で２つ以上のアプレット４６−１，４６−２が実行されている場合、それぞれのアプレット４６−１，４６−２が同じシングルスレッドプログラム１８を呼び出す場合がある。このような場合、本発明にあっては、例えば最初にアプレット４６−１がシングルスレッドプログラム１８を呼び出そうとした場合に呼出専用スレッド２０を生成し、シングルスレッドプログラム１８を呼び出すための同期イベントを生成してイベントキュー２６に投入する。
【００９６】
呼出専用スレッド２０はイベントキュー２６から同期イベントを取り出し、同期イベントに基づいてシングルスレッドプログラム１８を実行し、実行終了を待って次の同期イベントをイベントキュー２６から取り出してシングルスレッドプログラム１８を実行することになる。
【００９７】
このためアプレット４６−１，４６−２が同じシングルスレッドプログラム１８を呼び出しても、アプレット４６−１，４６−２の呼出し順に従ってシングルスレッドプログラム１８が実行され、複数のアプレットにより同じシングルスレッドプログラム１８のアクセスが競合することは起きない。
【００９８】
この場合についてもアプレット４６−１でシングルスレッドプログラム１８を呼び出す際に環境定義テーブル２２を参照し、図４のようにモード５２がシングルモードであれば呼出専用スレッド２０を使用したシングルスレッドプログラム１８の呼出しを行い、これに対しマルチモードであれば呼出専用スレッド２０を使用せずにバイパスし、直接シングルスレッドプログラム１８を呼び出して実行するようになる。
【００９９】
また、呼出専用スレッド２０に設けられたイベントキュー２６の内容は、図５のグループと優先度を持たない場合あるいは図６のグループと優先度を設けた場合のいずれの場合も同様に適用される。
【０１００】
図１２は図１１のブラウザ４４におけるマルチスレッド処理の全体的な処理動作のフローチャートである。図１２において、クライアント４２のブラウザ４４を起動すると、ステップＳ１で図示しないルートスレッドが生成される。この状態でメソッド呼出しをステップＳ２で判別すると、ルートスレッドが例えば呼出しごとにスレッド１６−１，１６−２を生成する。
【０１０１】
生成されたスレッド１６−１，１６−２は、ステップＳ４でＷＷＷサーバ４０をアクセスしてアプレット４６−１，４６−２をダウンロードする。そしてブラウザ４４上でステップＳ５のように複数のアプレット４６−１，４６−２を並列に実行する。
【０１０２】
このアプレット４６−１，４６−２の並列実行において動的ライブラリとしてのシングルスレッドプログラム１８を呼び出す場合があり、この場合には呼出専用スレッド２０を生成し、そのイベントキュー２６に同期イベントを投入し、イベントキュー２６からの同期イベントの先入れ，先出しによる取出しでアプレット４６−１，４６−２の呼出要求の順番にシングルスレッドプログラム１８を実行する。
【０１０３】
続いてステップＳ６でブラウザ４４の終了をチェックしており、ブラウザ４４が終了すると、ステップＳ７でルートスレッドグループのスレッドに終了を通知して一連の処理を終了する。このルートスレッドグループにはブラウザ４４の中で唯一存在している呼出専用スレッド２０も含まれており、ブラウザの終了に同期して呼出専用スレッド２０も終了することになる。
【０１０４】
この場合のアプレット生成実行処理は、ＷＷＷブラウザからダウンロードする以外は図８のユーザスレッド生成実行処理と同じであり、またアプレットで生成する呼出専用スレッドの生成処理は図９のフローチャートと同じであり、更に生成した呼出専用スレッドによるシングルスレッドプログラムの呼出処理は図１０のフローチャートと同じになる。
【０１０５】
更に本発明はマルチスレッドプログラムを格納したコンピュータ可読の記録媒体を提供するものであり、この記録媒体の実施形態としてはＣＤ−ＲＯＭやフロッピディスク等のリムーバブルな可搬型記録媒体、回線によりプログラムを提供するプログラム提供者の記憶装置、更にプログラムをインストールした処理装置のＲＡＭやハードディスク等のメモリ装置がある。また、記録媒体によって提供されたマルチスレッド処理プログラムは処理装置にローディングされ、その主メモリ上で実行される。
【０１０６】
尚、図２の実施形態にあっては、Ｊａｖａの標準で付属している手法である遠隔メソッド起動ＲＭＩによる分散実行を例にとるものであったが、ＣＯＲＢＡ（Common Object Request Broker Architecture ）を採用した一部のＣＯＲＢＡサーバの分散実行においても、同様にマルチスレッドプログラムが別プロセスのシングルスレッドプログラム１８を呼び出す場合があるので、このＣＯＲＢＡサーバの分散実行についても本発明の呼出専用スレッド２０を生成して呼び出す手順をそのまま適用することができる。
【０１０７】
また本発明は上記の実施形態に限定されず、その目的と利点を損なわない適宜の変形を含む。更に本発明は上記実施形態に示した数値による限定は受けない。
【０１０８】
【発明の効果】
以上説明してきたように本発明によれば、マルチスレッドプログラムからシングルスレッドプログラムを呼び出す際に別プロセスを生成する必要がないため、処理負担を低減し、実行性能を向上することができる。
【０１０９】
また本発明にあっては、マルチスレッドプログラムからシングルスレッドプログラムを呼び出す際に、シングルスレッドプログラムをマルチスレッドプログラムに作り直す必要がないため、プログラムの開発効率を向上することができる。
【０１１０】
また本発明にあっては、シングルスレッドプログラムを呼び出す唯一の呼出専用スレッドをルートスレッド（メインスレッド）と同じスレッドグループに属するようにし、メインプログラムの終了時に呼出専用スレッドの終了を保証することでマルチプログラムのプロセスに複数の専用スレッドが存在することを防ぎ、唯一の呼出専用スレッドを存在させることでシングルスレッドプログラム１８に対するアクセスを全てシングルスレッド動作で行うことができる。
【０１１１】
更に本発明にあっては、シングルスレッドプログラムの中にはマルチスレッドで動作しても問題を起こすことのないプログラムがあることから、呼出専用スレッドを必要とするか否か判断し、必要のない場合には呼出専用スレッドをバイパスして直接シングルスレッドプログラムを呼び出すことで、マルチスレッド動作による呼出しで問題のないシングルスレッドプログラムを呼び出す場合の実行性能を向上させることができる。
【図面の簡単な説明】
【図１】本発明の原理説明図
【図２】遠隔メソッド呼出ＲＭＩを用いてサーバアプリケーションのマルチスレッドプログラムを実行する本発明の第１実施形態のブロック図
【図３】図２の呼出専用スレッドを使用してシングルスレッドプログラムの静的変数をアクセスした場合の説明図
【図４】図２のサーバアプリケーションで呼出専用スレッドの必要性の有無の判定に使用する環境定義テーブルの説明図
【図５】図２のスレッドがシングルスレッドプログラムを呼出す際に使用する識別情報テーブルと呼出専用スレッドに投入する同期イベントの説明図
【図６】呼出スレッドのイベントキューに投入された優先度を設定した同期イベントの説明図
【図７】図２のサーバアプリケーションによるマルチスレッド処理のフローチャート
【図８】図７におけるユーザスレッド生成実行処理の詳細フローチャート
【図９】図８における呼出専用スレッドの生成処理の詳細フローチャート
【図１０】図８で生成した呼出専用スレッドの処理動作のフローチャート
【図１１】サーバからクライアントのブラウザにダウンロードしたアプレットが呼出専用スレッドを使用してシングルスレッドプログラムを呼出す実施形態のブロック図
【図１２】図１１のブラウザによるマルチスレッド処理のフローチャート
【図１３】遠隔メソッド呼出ＲＭＩを用いてサーバアプリケーションのマルチスレッドプログラムを実行する従来例のブロック図
【図１４】図１３で２つのスレッドがシングルスレッドプログラムの静的変数をアクセスした場合の説明図
【図１５】サーバからクライアントのブラウザにダウンロードしたアプレットが専用スレッドを使用してシングルスレッドプログラムを呼出す従来例のブロック図
【符号の説明】
１０：ＲＭＩサーバアプリケーション（マルチスレッドプログラム）
１２，１２−１，１２−２：クライント
１４：ルートスレッド（メインスレッド）
１６，１６−１，１６−２：スレッド（ユーザスレッド）
１８：シングルスレッドプログラム
２０：呼出専用スレッド
２２：環境定義テーブル
２６：イベントキュー
２８：同期イベント
３０：主記憶
３２：プロセス領域
３４−１，３４−２：スレッド対応領域
３６：データ領域
３８：静的関数割当領域
４０：ＷＷＷサーバ
４２：クライアント
４４：ブラウザ
４６−１，４６−２：アプレット
【図１】
0003807588.tif 000002
【図２】
0003807588.tif 000003
【図３】
0003807588.tif 000004
【図４】
0003807588.tif 000005
【図５】
0003807588.tif 000006
【図６】
0003807588.tif 000007
【図７】
0003807588.tif 000008
【図８】
0003807588.tif 000009
【図９】
0003807588.tif 000010
【図１０】
0003807588.tif 000011
【図１１】
0003807588.tif 000012
【図１２】
0003807588.tif 000013
【図１３】
0003807588.tif 000014
【図１４】
0003807588.tif 000015
【図１５】
0003807588.tif 000016