(57)【要約】【課題】  マルチスレッドアプリケーションにおいて、あるスレッド上での例外発生が、他のスレッドへ与える影響を最小限にすることが可能なマルチスレッドアプリケーションのアボート処理システムを提供すること。【解決手段】  複数のスレッド２及び２２などから構成されるマルチスレッドアプリケーション２のアボート処理システムであって、アプリケーションプログラム１３のトランザクション処理とアボート処理１８とを排他制御するようにしたことを特徴とする。【選択図】      図１
2009122876.tif 000002
【特許請求の範囲】
【請求項１】
マルチスレッドアプリケーションのアボート処理システムであって、アボート処理とトランザクション処理とを排他制御する手段を含むことを特徴とするシステム。
【請求項２】
前記手段は、あるスレッドのアボート処理中に、他のスレッドの新規のトランザクション処理の開始を抑止制御することを特徴とする請求項１記載のシステム。
【請求項３】
前記手段は、あるスレッドのアボート処理を、他のスレッドのトランザクション処理が完了するまで待ち合わせるよう制御することを特徴とする請求項１または２記載のシステム。
【請求項４】
あるスレッドで例外が発生した場合に、他のスレッドで実行中であったトランザクションをロールバックせさて、そのトランザクションを別のプロセスにより実行制御する手段を、更に含むことを特徴とする請求項１〜３いずれか記載のシステム。
【請求項５】
マルチスレッドアプリケーションのアボート処理方法であって、アボート処理とトランザクション処理とを排他制御するステップを含むことを特徴とする方法。
【請求項６】
前記ステップは、あるスレッドのアボート処理中に、他のスレッドの新規のトランザクション処理の開始を抑止制御することを特徴とする請求項５記載の方法。
【請求項７】
前記ステップは、あるスレッドのアボート処理を、他のスレッドのトランザクション処理が完了するまで待ち合わせるよう制御することを特徴とする請求項５または６記載の方法。
【請求項８】
あるスレッドで例外が発生した場合に、他のスレッドで実行中であったトランザクションをロールバックせさて、そのトランザクションを別のプロセスにより実行制御するステップを、更に含むことを特徴とする請求項５〜７いずれか記載の方法。
【請求項９】
マルチスレッドアプリケーションのアボート処理方法をコンピュータに実行させるためのプログラムであって、アボート処理とトランザクション処理とを排他制御する処理を含むことを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はマルチスレッドアプリケーションのアボート処理システム及びその方法並びにプログラムに関し、特にコンピュータで実行されるプロセスを複数のスレッドで構成するマルチスレッドアプリケーションのアボート処理方式に関するものである。
【背景技術】
【０００２】
コンピュータにおいて、アプリケーションプログラムなどのプロセスを処理する場合に、１つのプロセスに複数のスレッドを割当てることにより、より高速なプログラム処理を実現する技術がある（例えば、特許文献１参照）。このようなマルチスレッドアプリケーションにおいて、複数のスレッドが独立したトランザクションを実行するようなアプリケーションでは、他のスレッドの処理状態を意識することなく、独立して処理を行うようになっている。そのために、例外発生時のアボート処理までも独立して処理を行うと、正常に動作中の別のスレッドまで強制終了されてしまうことになる。
【０００３】
すなわち、マルチスレッドでオンライントランザクションを処理した場合、あるスレッド上で例外が発生すると、そのスレッド上で例外処理が実行されることになるが、他のスレッドの処理状態を意識せずに必要な終了処理を実行してしまうと、そのスレッドが終了した時点で、当該他のスレッドが業務処理中であっても、全て強制終了されてしまうことになる。また、例外発生処理中においても、別のスレッド上では、新規トランザクションを開始してしまい、それらも強制終了されてしまうことになる。
【０００４】
なお、特許文献２を参照すると、プロセス処理中に例外発生によるアボート発生時に、アボート処理を保留して例外が発生しなかったかの如く処理を継続し、プロセス処理出口で例外が保留されていれば、保留がなくなるまで対応する例外処理をなす技術が開示されている。
【０００５】
【特許文献１】特開平１１−２３２１４３号公報
【特許文献２】特開平０４−２１９８２８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
上述した特許文献２では、アボート発生時のアボート処理を保留することが開示されており、この場合、アボート発生したスレッド処理を続行してトランザクション完了後に、アボート処理を行うようになっている。この特許文献２の技術では、マルチスレッドアプリケーションにおけるあるスレッド上での例外発生を対象としているものではないために、上述した如く、あるスレッド上での例外発生が、他のスレッドへ与える影響は何等考慮されていないことになる。
【０００７】
本発明の目的は、マルチスレッドアプリケーションにおいて、あるスレッド上での例外発生が他のスレッドへ与える影響を最小限にすることが可能なマルチスレッドアプリケーションのアボート処理システム及びその方法並びにプログラムを提供することである。
【課題を解決するための手段】
【０００８】
本発明によるマルチスレッドアプリケーションのアボート処理システムは、アボート処理とトランザクション処理とを排他制御する手段を含むことを特徴とする。
【０００９】
本発明によるマルチスレッドアプリケーションのアボート処理方法は、アボート処理とトランザクション処理とを排他制御するステップを含むことを特徴とする。
【００１０】
本発明によるマルチスレッドアプリケーションのアボート処理方法をコンピュータに実行させるためのプログラムは、アボート処理とトランザクション処理とを排他制御する処理を含むことを特徴とする。
【発明の効果】
【００１１】
本発明によれば、アボート処理とトランザクション処理とを排他的に実行するようにしたので、あるスレッド上での例外発生が、他のスレッドへ与える影響を最小限にすることができるという効果がある。
【発明を実施するための最良の形態】
【００１２】
以下に、本発明の実施の形態について図面を用いて説明する。図１は本発明の実施の形態を示す機能ブロック図である。図１を参照すると、本発明の実施の形態は、メッセージキュー１と、マルチスレッドアプリケーション２，２２とを含んで構成されている。メッセージキュー１は、マルチスレッドアプリケーション２や２２が処理するメッセージを格納しているキューである。
【００１３】
マルチスレッドアプリケーション２及び２２は同一構成であるので、アプリケーション２のみについて機能ブロックを示している。
【００１４】
マルチスレッドアプリケーションは複数のスレッド＃１，＃２，＃３，…を有しており、各スレッドは同一構成であるので、スレッド＃１についてのみ機能ブロックを示している。スレッド＃１は、トランザクション初期化処理９と、アプリケーションプログラム１３と、トランザクション終了処理１４と、アボート処理１８とを有している。
【００１５】
トランザクション初期化処理９は、アボート処理中スレッド番号参照部１０と、排他処理部（共有）１１と、メッセージ取得部１２とを有している。トランザクション終了処理１４は、アボート処理中スレッド番号参照部１５と、入力メッセージ再処理部１６と、排他処理解除部１７とを有している。アボート処理１８は、アボート処理中スレッド番号更新部１９と、排他処理部（占有）２０と、アボートメイン処理部２１とを有している。
【００１６】
また、マルチスレッドアプリケーション２は、上述した複数のスレッドの他に、プロセス初期化処理６を有しており、このプロセス初期化処理６は、アボート処理中スレッド番号初期化部７と、排他処理用ｍｕｔｅｘ初期化部８とを有している。更に、マルチスレッドアプリケーション２には、プロセスメモリ領域３０及びスレッドメモリ領域４０が設けられている。プロセスメモリ領域３０は、アボート処理中スレッド番号３と、排他処理用ｍｕｔｅｘ４とを有しており、スレッドメモリ領域４０は、保存用入力メッセージ５を有している。
【００１７】
メッセージキュー１は、前述した如く、マルチスレッドアプリケーションが処理するメッセージを格納しており、マルチスレッドアプリケーションの各スレッドは、メッセージ取得部１２を用いてメッセージキュー１からメッセージを取得して、トランザクション処理を実行する。メッセージキュー１は、複数のマルチスレッドアプリケーション２，２２に共通であり、両アプリケーション２，２２からアクセスされるものである。
【００１８】
アボート処理中スレッド番号３は、マルチスレッドアプリケーション毎に、現在アボート処理中のスレッド番号を格納するためのメモリ領域であり、アボート処理中スレッド番号初期化部７により、“＃０”に初期化され、あるスレッド上で例外が発生した場合に、アボート処理中スレッド番号更新部１９において、スレッド番号が設定される。
【００１９】
排他処理用ｍｕｔｅｘ４は、スレッド間の排他制御に用いられるメモリ領域であり、排他処理用ｍｕｔｅｘ初期化部８により初期化され、排他処理部（共有）１１、排他処理部（占有）２０及び排他処理解除部１７による排他制御にて使用される。この排他処理用ｍｕｔｅｘは、複数のスレッドが排他制御を実行する際に共通して使用する識別情報であって、共有ロック状態か占有ロック状態かを示す識別情報である。
【００２０】
保存入力用メッセージ５は、再処理用に保存される入力メッセージのコピーであり、メッセージ取得部１２によってメッセージが取得される度に、その取得されたメッセージに更新される。そして、アボート処理が発生していた場合に、この保存入力用メッセージ５は、入力メッセージ再処理部１６によってメッセージキュー１に再投入（ロールバック）されることになる。
【００２１】
次に、図１を参照して本発明の実施の形態の動作概略を説明する。先ず、プロセス初期化処理６は、以下の手順を実行する。なお、以下の手順の（ａ），（ｂ）などは、図１の手順ａ，ｂなどとそれぞれ対応しているものとする。
（ａ）アボート処理中スレッド番号初期化部７を呼び出し、アボート処理中スレッド番号３を初期化する。
（ｂ）排他処理用ｍｕｔｅｘ初期化部８を呼び出し、排他処理用ｍｕｔｅｘ４の初期化を行う。
【００２２】
トランザクション初期化処理９は、以下の手順を実行する。
（ｃ）アボート処理中スレッド番号参照部１０を呼び出し、アボート処理中かチェックする。アボート処理中の場合スレッドを終了し、アボート処理中でなかった場合のみ、次の（ｄ）以降の処理を行うことになる。
（ｄ）排他処理部（共有）１１を呼び出し、共有ロックを実行する。
（ｅ）メッセージ取得部１２を呼び出し、メッセージキュー１からメッセージを取得し、再処理用に保存用入力メッセージ５にコピーを作成する。
【００２３】
トランザクション終了処理１４は、以下の手順を実行する。
（ｆ）アボート処理中スレッド番号参照部１５を呼び出し、アボート処理中かチェックする。
（ｇ）上記の（ｆ）でアボート処理中ではなかった場合には、トランザクションをコミットする。
【００２４】
（ｈ）上記の（ｆ）でアボート処理中だった場合には、トランザクションをロールバックし、入力メッセージ再処理部１６を呼び出し、上記の（ｅ）でコピーした取得メッセージをメッセージキュー１に再投入する。
（ｉ）排他処理解除部１７を呼び出し、上記の（ｄ）で実行した共有ロックを解除する。
【００２５】
例外が発生していない状態では、トランザクション初期化処理９、アプリケーションプログラム１３、トランザクション終了処理１４が繰り返し実行されることになる。
【００２６】
あるスレッド上で例外が発生した場合のアボート処理１８は、以下の手順を実行する。
（ｊ）アボート処理中スレッド番号更新部１９を呼び出し、アボート処理中スレッド番号３に自スレッド番号を設定する。
（ｋ）排他処理部（占有）２０を呼び出し、占有ロックを実行する。
（ｌ）上記の（ｋ）のロックが取得できたら、アボートメイン処理２１を実行してプロセスを終了する。
（ｍ）上記の（ｈ）で再投入されたメッセージについては、メッセージキュー１を共有している別のマルチスレッドアプリケーション２２上で再実行されることになる。
【００２７】
以下に、本発明の理解をより良くするために、図２〜図４の処理フロー図を用いて具体的な動作例について説明する。図２は例外発生が起きていない場合の各スレッド（スレッド＃１及び＃２）の処理フローである。なお、プロセス初期化処理９は、上述した（ａ），（ｂ）の手順を実行したものとする。
【００２８】
先ず、スレッド＃１は、アボート処理中スレッド番号参照部１０により、アボート処理中スレッド番号を参照する（ステップＳ１）。この場合、アボート処理中スレッド番号は「＃０」であるので、排他処理部（共有）１１により共有ロックを実行する（ステップＳ２）。そして、メッセージ取得部１２により、メッセージキュー１からメッセージを取得し（ステップＳ３）、アプリケーションプログラム１３を呼び出して当該プログラムを実行する（ステップＳ４）。
【００２９】
スレッド＃１による共有ロック時において、スレッド＃２がトランザクション処理を開始してアボート処理中スレッド番号を参照したとする（ステップＳ１１）。このとき、アボート処理中スレッド番号は「＃０」であるので、スレッド＃２も排他処理部（共有）により共有ロックを実行する（ステップＳ１２）。そして、スレッド＃２はメッセージ取得部により、メッセージキュー１からメッセージを取得し（ステップＳ１３）、アプリケーションプログラムを呼び出して当該プログラムを実行する（ステップＳ１４）。
【００３０】
スレッド＃１のトランザクション終了時には、スレッド＃１のトランザクション終了処理１５は、スレッド＃１のアボート処理中スレッド番号参照部１５により、アボート処理中スレッド番号を参照する（ステップＳ５）。このとき、アボート処理中スレッド番号は「＃０」であるので、スレッド＃１は、排他処理解除部１７により、共有ロックを解除する（ステップＳ６）。
【００３１】
スレッド＃２のトランザクション終了時においても、スレッド＃２は、アボート処理中スレッド番号を参照し（ステップＳ１５）、アボート処理中スレッド番号が「＃０」であるから、排他処理解除を行って共有ロック解除となる（ステップＳ１６）。
【００３２】
この様に、アボート処理中スレッド番号の参照は、メモリ領域３０の参照のみであり、また、トランザクション処理中の排他処理は共有で行うようにしているので、互いのスレッドが、正常系への処理への影響を与えることはほとんどないことになる。
【００３３】
図３は、例外発生したスレッド＃１と、この例外発生後にトランザクションを開始したスレッド＃２との処理フローであり、図２のステップと同等ステップには同一符号をもって示している。スレッド＃１のステップＳ４において、アプリケーションプログラム１３の呼び出しを行って、その実行中に、内部で例外が発生したとすると、アボート処理１８のアボート処理中スレッド番号更新部１９を呼び出して、アボート処理中スレッド番号に自スレッド番号である「＃１」を設定する（ステップＳ２５）。そして、スレッド＃１は、排他処理部（占有）２０を呼び出して占有ロックを実行する（ステップＳ２６）。その後、スレッド＃１は、アボートメイン処理２１を実行して、プロセス終了となる（ステップＳ２７）。
【００３４】
スレッド＃１に例外が発生した後に、スレッド＃２がトランザクション処理を開始すると、アボート処理中スレッド番号を参照するが（ステップＳ１１）、このときのアボート処理中スレッド番号は「＃１」となっているので、スレッド終了となる（ステップＳ３２）。
【００３５】
この様に、あるスレッドのアボート処理中における他のスレッドのトランザクション処理の開始は抑制するようにしているので、すなわち、アボート処理とトランザクション処理とを排他的に制御しているので、あるスレッド上での例外発生が、他のスレッドへ与える影響を抑えることができることになる。
【００３６】
図４は、例外発生したスレッド＃１と、この例外発生前にトランザクション処理を開始していたスレッド＃２との処理フローであり、図２及び図３と同等ステップには同一符号をもって示している。図３の例と同じく、スレッド＃１のステップＳ４において、例外が発生したとすると、アボート処理中スレッド番号に自スレッド番号である「＃１」を設定し（ステップＳ２５）、占有ロックを実行する（ステップＳ２６）。
【００３７】
スレッド＃１の例外発生前（ステップＳ４の前）に、スレッド＃２がトランザクション処理を開始していたとすると、図２の例と同じく、ステップＳ１１〜Ｓ１４の処理をスレッド＃２は実行することになる。このとき、スレッド＃２は排他処理（共有）を実行している状態であるので（ステップＳ１２参照）、スレッド＃１のアボート処理は、スレッド＃２の排他処理（共有）が解除されるまで、待ち状態となる。
【００３８】
そして、スレッド＃２のアプリケーションプログラムが終了すると、スレッド＃２はアボート処理中スレッド番号を参照する（ステップＳ１５）。このとき、アボート処理中スレッド番号は＃１であるので、スレッド＃２は、実行中だったトランザクションをロールバックする（ステップＳ５６）。
【００３９】
すなわち、スレッド＃２は、入力メッセージ再処理部１６を呼び出して、保存用入力メッセージ５にコピーしていたメッセージを、メッセージキュー１へ再投入するのである。この再投入されたメッセージについては、メッセージキュー１を共有している別のマルチスレッドアプリケーション（例えば、図１のマルチスレッドアプリケーション２２）上で再実行される（ステップＳ５７）。
【００４０】
そして、スレッド＃２が処理を完了して排他処理を解除すると（ステップＳ５８）、ここで初めてスレッド＃１の排他処理（占有）が取得され、スレッド＃１のアボートメイン処理が実行可能となるのである（ステップＳ２７）。
【００４１】
なお、複数のスレッドがトランザクション実行中であった場合には、全てのスレッド排他処理が解除されるまで、アボートメイン処理は待ちの状態となっている。
【００４２】
上述した処理フローは、予めその動作手順をコンピュータ読取り可能なプログラムとしてＲＯＭなどの記録媒体に格納しておき、これをコンピュータに読取らせて実行させるように構成できることは明白である。
【図面の簡単な説明】
【００４３】
【図１】本発明の実施の形態の機能ブロック図である。
【図２】本発明の実施の形態の動作の１例を示す処理フローである。
【図３】本発明の実施の形態の動作の他の例を示す処理フローである。
【図４】本発明の実施の形態の動作の別の例を示す処理フローである。
【符号の説明】
【００４４】
１  メッセージキュー
２，２２  マルチスレッドアプリケーション
３  アボート処理中スレッド番号
４  排他処理用ｍｕｔｅｘ
５  保存用入力メッセージ
６  プロセス初期化処理
７  アボート処理中スレッド番号初期化部
８  排他処理用ｍｕｔｅｘ初期化部
９  トランザクション初期化処理
１０，１５  アボート処理中スレッド番号参照部
１１  排他処理部（共有）
１２  メッセージ取得部
１３  アプリケーションプログラム
１４  トランザクション終了処理
１６  入力メッセージ再処理部
１７  排他処理解除部
１８  アボート処理
１９  アボート処理中スレッド番号更新部
２０  排他処理部（占有）
２１  アボートメイン処理
３０  プロセスメモリ領域
４０  スレッドメモリ領域
【図１】
2009122876.tif 000003
【図２】
2009122876.tif 000004
【図３】
2009122876.tif 000005
【図４】
2009122876.tif 000006