(57)【特許請求の範囲】
【請求項１】
複数のスレッドで順序付きトランザクションを実行する方法であって、コンピュータが、
複数のスレッドそれぞれのトランザクションの少なくとも１つにおいてアボートが起きたことを検出するステップと、
前記アボートが検出されたスレッドを含む少なくとも２つのスレッドをバリア同期するステップであって、前記バリア同期とは、複数のスレッドにおいて、各トランザクションを実行している場合に、全ての又は特定のスレッドを除く全てのスレッドにおいてトランザクションがコミット又はアボートされるまで実行されるが、全てのトランザクションがコミット又はアボートされるまでその先に実行が進行しないことをいう、前記バリア同期するステップと
を実行することを含む、前記方法。
【請求項２】
複数のスレッドで順序付きトランザクションを実行する方法であって、コンピュータが、
複数のスレッドそれぞれのトランザクションの少なくとも１つにおいてアボートが起きたことを検出するステップと、
前記アボートが検出されたスレッドを含む少なくとも２つのスレッドをバリア同期するステップであって、前記バリア同期とは、複数のスレッドにおいて、各トランザクションを実行している場合に、全ての又は特定のスレッドを除く全てのスレッドにおいてトランザクションがコミット又はアボートされるまで実行されるが、全てのトランザクションがコミット又はアボートされるまでその先に実行が進行しないことをいう、前記バリア同期するステップと
を実行することを含み、
前記バリア同期するステップが、下記（１）〜（４）のいずれか一つのステップ
（１）前記アボートが検出された時点で処理中のトランザクションが全てコミットされるまで、前記複数のスレッド全てをバリア同期するステップ
（２）前記アボートが検出された時点で処理中のトランザクションが全てアボートされるまで、前記複数のスレッド全てをバリア同期するステップ
（３）前記アボートが検出された時点で処理中のトランザクションの実行順が遅い１つ又は複数のスレッドを除く前記複数のスレッド全て中のトランザクションが全てコミットされるまで、前記複数のスレッド全てをバリア同期するステップ
（４）前記アボートが検出された時点で処理中のトランザクションの実行順が遅い１つ又は複数のスレッドを除く前記複数のスレッド全て中のトランザクションが全てアボートされるまで、前記複数のスレッド全てをバリア同期するステップ
を含む、前記方法。
【請求項３】
複数のスレッドで順序付きトランザクションを実行する方法であって、コンピュータが、
複数のスレッドそれぞれのトランザクションの少なくとも１つにおいてアボートが起きたことを検出するステップと、
前記アボートが検出されたスレッドを含む少なくとも２つのスレッドをバリア同期するステップであって、前記バリア同期とは、複数のスレッドにおいて、各トランザクションを実行している場合に、全ての又は特定のスレッドを除く全てのスレッドにおいてトランザクションがコミット又はアボートされるまで実行されるが、全てのトランザクションがコミット又はアボートされるまでその先に実行が進行しないことをいう、前記バリア同期するステップと
を実行することを含み、
前記コンピュータが、
アボート率を計測するステップ
をさらに実行するステップを含み、
前記コンピュータが、
前記計測するステップで計測したアボート率が所定の閾値より低い場合に、前記検出するステップ及び前記バリア同期するステップを繰り返すステップ
をさらに実行することを含む、
前記方法。
【請求項４】
前記アボート率を計測するステップが、
前記アボートを検出することに応じて、
バリア同期が終了することに応じて、
所定の時間間隔で、又は、
所定量のトランザクションが処理されることに応じて
行われる、請求項３に記載の方法。
【請求項５】
前記コンピュータが、
アボート率を計測するステップ
をさらに実行するステップを含み、
前記コンピュータが、
前記計測するステップで計測したアボート率が所定の閾値より低い場合に、前記検出するステップ及び前記バリア同期するステップを繰り返すステップ
をさらに実行することを含む、
請求項１又は２に記載の方法。
【請求項６】
前記アボート率を計測するステップが、
前記アボートを検出することに応じて、
バリア同期が終了することに応じて、
所定の時間間隔で、又は、
所定量のトランザクションが処理されることに応じて
行われる、請求項５に記載の方法。
【請求項７】
複数のスレッドで順序付きトランザクションを実行するためのコンピュータであって、
複数のスレッドそれぞれのトランザクションの少なくとも１つにおいてアボートが起きたことを検出するアボート検出手段と、
前記アボートが検出されたスレッドを含む少なくとも２つのスレッドをバリア同期するバリア同期手段であって、前記バリア同期とは、複数のスレッドにおいて、各トランザクションを実行している場合に、全ての又は特定のスレッドを除く全てのスレッドにおいてトランザクションがコミット又はアボートされるまで実行されるが、全てのトランザクションがコミット又はアボートされるまでその先に実行が進行しないことをいう、前記バリア同期手段と
を備えている、前記コンピュータ。
【請求項８】
複数のスレッドで順序付きトランザクションを実行するためのコンピュータであって、
複数のスレッドそれぞれのトランザクションの少なくとも１つにおいてアボートが起きたことを検出するアボート検出手段と、
前記アボートが検出されたスレッドを含む少なくとも２つのスレッドをバリア同期するバリア同期手段であって、前記バリア同期とは、複数のスレッドにおいて、各トランザクションを実行している場合に、全ての又は特定のスレッドを除く全てのスレッドにおいてトランザクションがコミット又はアボートされるまで実行されるが、全てのトランザクションがコミット又はアボートされるまでその先に実行が進行しないことをいう、前記バリア同期手段と
を備えており、
前記バリア同期手段が、下記（１）〜（４）のいずれか一つ
前記アボートが検出された時点で処理中のトランザクションが全てコミットされるまで、前記複数のスレッド全てをバリア同期する、
前記アボートが検出された時点で処理中のトランザクションが全てアボートされるまで、前記複数の全てのスレッド全てをバリア同期する、
前記アボートが検出された時点で処理中のトランザクションの実行順が遅い１つ又は複数のスレッドを除く前記複数のスレッド全て中のトランザクションが全てコミットされるまで、前記複数のスレッド全てをバリア同期する、
前記アボートが検出された時点で処理中のトランザクションの実行順が遅い１つ又は複数のスレッドを除く前記複数のスレッド全て中のトランザクションが全てアボートされるまで、前記複数のスレッド全てをバリア同期する、
を実行する、
前記コンピュータ。
【請求項９】
複数のスレッドで順序付きトランザクションを実行するためのコンピュータであって、
複数のスレッドそれぞれのトランザクションの少なくとも１つにおいてアボートが起きたことを検出するアボート検出手段と、
前記アボートが検出されたスレッドを含む少なくとも２つのスレッドをバリア同期するバリア同期手段であって、前記バリア同期とは、複数のスレッドにおいて、各トランザクションを実行している場合に、全ての又は特定のスレッドを除く全てのスレッドにおいてトランザクションがコミット又はアボートされるまで実行されるが、全てのトランザクションがコミット又はアボートされるまでその先に実行が進行しないことをいう、前記バリア同期手段と
を備えており、
前記コンピュータが、
アボート率を計測するアボート率計測手段
をさらに備えており、
前記コンピュータが、
前記アボート率計測手段で計測したアボート率が所定の閾値より低い場合に、前記検出すること及び前記バリア同期することを繰り返す、
前記コンピュータ。
【請求項１０】
前記アボート率計測手段が、
前記アボートを検出することに応じて、
バリア同期が終了することに応じて、
所定の時間間隔で、又は、
所定量のトランザクションが処理されることに応じて
前記アボート率を計測する、
請求項９に記載のコンピュータ。
【請求項１１】
前記コンピュータが、
アボート率を計測するアボート率計測手段
をさらに備えており、
前記コンピュータが、
前記アボート率計測手段で計測したアボート率が所定の閾値より低い場合に、前記検出すること及び前記バリア同期することを繰り返す、
請求項７又は８に記載のコンピュータ。
【請求項１２】
前記アボート率計測手段が、
前記アボートを検出することに応じて、
バリア同期が終了することに応じて、
所定の時間間隔で、又は、
所定量のトランザクションが処理されることに応じて
前記アボート率を計測する、
請求項１１に記載のコンピュータ。
【請求項１３】
複数のスレッドで順序付きトランザクションを実行するためのコンピュータ・プログラムであって、コンピュータに、請求項１〜６のいずれか一項に記載の方法の各ステップを実行させる、前記コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のスレッドで順序付きトランザクションを実行するための技法に関する。
【背景技術】
【０００２】
シングルスレッド（単一スレッド）のプログラムを投機的に並列化して高速化する手法として、スレッドレベル投機（Thread-Level Speculation; TLS）がある（例えば、下記非特許文献１を参照）。スレッドレベル投機では、ループの各繰り返しが別々のスレッドに割り当てられて、当該繰り返しが並列に実行される。繰り返し間のメモリデータ依存関係を実行時に検知するために、各繰り返しは別々のトランザクションとして実行される。従って、スレッドレベル投機においてシングルスレッド実行と同じ実行結果を保証するために、各トランザクションはシングルスレッド実行と同じ順序でコミットされる必要がある。
【０００３】
図１３中の「（１）シングルスレッド実行」（１３０１）は、シングルスレッド（１３１１）による各トランザクションの実行を示す。シングルスレッドによる各トランザクションの実行において、当該各トランザクションは、トランザクション１，２，３，・・・のようにトランザクションの番号順で実行され、そしてコミットされる。
【０００４】
図１３中の「（２）マルチスレッド（３スレッド）実行」（１３２１）は、スレッド数が３であるマルチスレッド（１３３１，１３３２及び１３３３）によるスレッドレベル投機実行を示す。当該スレッドレベル投機実行において、各トランザクションは、各スレッドで並列的に実行されるが、トランザクション１，２，３，・・・のようにトランザクションの番号順でコミットされなければならない。
【０００５】
下記特許文献１は、トランザクショナル実行によるロックのない同期を利用して、複数のソフトウェアスレッド間の共有メモリ・アクセスをハンドリングするための装置及び方法を記載する（段落００１０）。また、特許文献１は、従来のロック技法と異なり、トランザクショナル実行は、通例、トランザクション／クリティカルセクションを投機的に実行すること、及び、トランザクションの最終ステータスを決定する場合に、投機的実行の終了まで状態更新を延期することを伴うこと（段落００２１）、トランザクション／ クリティカルセクションの実行終了時に、結果が一致していないか又は無効であるとみなされる場合、トランザクション／クリティカルセクションは、リタイヤされず、状態更新は、レジスタにもメモリにもコミットされないこと、加えて、トランザクションがリタイヤされない場合、トランザクションを再実行するための２つの選択肢として、（１）トランザクションを前に実行されたように投機的に再実行すること、又は、（２）ロック／セマフォを利用してトランザクションを非投機的に再実行することが含まれること（段落００２３）を記載する。
【０００６】
下記特許文献２は、現行スレッドと、当該現行スレッドによりデータが参照される参照スレッドとを並列に実行し、前記現行スレッドが第１の同期点に達したとき、前記参照スレッドが第２の同期点に達したか否かを判別し、前記判別が否の場合、前記参照スレッドが前記第２の同期点に到達するまでの所要時間を前記現行スレッドの待機時間として求め、前記現行スレッドが前記参照スレッドの前記第２の同期点での処理データを参照して生成するデータと、前記現行スレッドが前記処理データを参照せずに生成するデータとの間の品質差分を推定し、前記待機時間および品質差分の大きさに応じて、前記現行スレッドを前記参照スレッドが前記第２の同期点に達するまで待機させるか否かを判定することを特徴とする同期制御方法を記載する（請求項１）。
【０００７】
下記特許文献３は、コンテナＣが保持するデータに対して操作命令を投機的に実行（投機実行）し、操作対象となるデータについて排他制御（ロック）を行わないことにより、複数のコンテナＣによる並列性を向上させることができることを記載する（段落００３５）。
【０００８】
下記特許文献４は、ＣＰＵによるロード命令の投機実行機能にもかかわらずメモリ・アクセスについてストア命令及びロード命令についての順序付けを保証するメモリ・アクセス順序付け及びロック管理を記載する（段落０００１）。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特表２００８−５２５９２３号公報
【特許文献２】国際公開第２００９／０９０９６４号
【特許文献３】特開２０１１−２３３０３３号公報
【特許文献４】特開２００３−３２３４１５号公報
【非特許文献】
【００１０】
【非特許文献１】Manoj Franklin and Gurindar S. Sohi, "The Expandable Split Window Paradigm for Exploiting Fine-Grain Parallelism,"Proceedings of the 19th Annual International Symposium on Computer Architecture, pp. 58-67, 1992.
【発明の概要】
【発明が解決しようとする課題】
【００１１】
スレッドレベル投機の実行の為には、順序付きトランザクション（ordered transaction）が必要であり、これまでは順序付きトランザクションをサポートした特別なハードウェアが用いられてきている。
【００１２】
しかしながら、順序付きトランザクションをサポートした特別なハードウェアでなく、一般的なハードウェア・トランザクショナル・メモリ（Hardware Transactional Memory; HTM）の機能のみを用いて、スレッドレベル投機を実装したいという要望がある。
【００１３】
ハードウェア・トランザクショナル・メモリは、一般のプロセッサ、例えば、インターナショナル・ビジネス・マシーンズ・コーポレーションのIBM zEnterprise EC12（zEC12）プロセッサ、インテル・コーポレーションのCoreマイクロ・アーキテクチャのプロセッサに搭載されている。
【００１４】
ハードウェア・トランザクショナル・メモリで順序付きトランザクションを実装する手法として、非トランザクション・ロード・ストアや条件付きコミットなどの特殊な命令を用いる方法がある。
【００１５】
しかしながら、これら特殊な命令は、上記zEC12プロセッサ及び上記Coreプロセッサを含め、ハードウェア・トランザクショナル・メモリが実装されている一般のプロセッサには搭載されていないのが現状である。
【００１６】
図１４（１４０１）は、上記一般のプロセッサに搭載されているハードウェア・トランザクショナル・メモリの機能を用いた順序付きトランザクションの単純実装による方法を示す。当該単純実装による方法では、上記一般のプロセッサは、各トランザクションの終了直前において対象のトランザクションがコミットされるべき順番にあるかをチェックし、当該順番になければ当該対象のトランザクションをアボートして、当該アボートしたトランザクションを再実行する。しかしながら、図１４に示すように、例えば、スレッド３（１４１３）において、トランザクション６の終了直前において、トランザクション６の先行番号５を有するトランザクション５はまだ終了していない。そこで、上記一般のプロセッサは、トランザクション６それ自身がコミットされるべき順番にないと判断し、当該トランザクション６をアボート（破棄ともいう）し（図１４に記載の「アボート発生」）、そしてアボートを検出すること（図１４に記載の「アボート検出」）に応じて当該トランザクション６を再実行（「再実行６」と表記する）する。同様に、スレッド１（１４１１）において、トランザクション７の終了直前において、トランザクション７の先行番号６を有するトランザクション６はまだ終了していない（再実行６として実行中である）。そこで、上記一般のプロセッサは、トランザクション７それ自身がコミットされるべき順番にないと判断し、当該トランザクション７をアボートし、そして当該トランザクション７を再実行（「再実行７」と表記する）する。同様に、スレッド２（１４１２）において、トランザクション８の終了直前において、トランザクション８の先行番号７を有するトランザクション７はまだ終了していない（トランザクション７はアボート中である）。そこで、上記一般のプロセッサは、トランザクション８それ自身がコミットされるべき順番にないと判断し、当該トランザクション８をアボートし、そして当該トランザクション８を再実行（「再実行８」と表記する）する。上記一般のプロセッサは、トランザクション９、１０及び１１それぞれについても同様にアボートし、そしてトランザクション９、１０及び１１それぞれを再実行（「再実行９」，「再実行１０」及び「再実行１１」と表記する）する。このように、上記単純実装による方法では、各トランザクションは、必ずしも同じ実行時間で実行されないことから、各トランザクションの終了順序が入れ替わり、アボートが起きてしまうことがある。
【００１７】
図１５は、図１４に示す単純実装による方法を処理するためのフローチャートを示す。コンピュータは、複数のスレッドの各スレッド（以下、ある１つの特定のスレッドを「対象スレッド」という）において、下記に示すステップ１５０１〜１５０７の各処理を実行する。
【００１８】
ステップ１５０１において、コンピュータは、上記対象スレッドにおいて、上記単純実装による方法の処理を開始する。
【００１９】
ステップ１５０２において、コンピュータは、全てのトランザクションを実行したかを判断する。コンピュータは、全てのトランザクションが実行されていないことに応じて、残りのトランザクションを実行する為に処理をステップ１５０３に進める。一方、コンピュータは、全てのトランザクションが実行されていることに応じて、処理を終了ステップ１５０８に進める。
【００２０】
ステップ１５０３において、コンピュータは、上記対象スレッドが次に実行すべきトランザクションの番号を取得する。
【００２１】
ステップ１５０４において、コンピュータは、上記対象スレッドにおいて、プロセッサに備わっている開始命令（例えば、上記zEC12におけるTBEGIN命令）を呼び出し、上記取得した番号のトランザクションの処理を開始する。
【００２２】
ステップ１５０５において、コンピュータは、上記トランザクションの処理の開始に応じて、上記対象スレッドにおいて、上記取得した番号のトランザクションを実行する。
【００２３】
ステップ１５０６において、コンピュータは、上記対象スレッドにおいて、当該トランザクションがアボートしたかを判断する。コンピュータは、当該トランザクションがアボートしたことに応じて、当該アボートされたトランザクションを再実行する為に、処理をステップ１５０４に戻す。一方、コンピュータは、当該トランザクションがアボートしていないことに応じて、処理をステップ１５０７に進める。
【００２４】
ステップ１５０７において、コンピュータは、上記対象スレッドにおいて、当該トランザクションがアボートしていないことに応じて、当該トランザクションの処理を終了する（すなわち、コンピュータは、当該トランザクションをコミットする）。コンピュータは、当該トランザクションの処理の終了に応じて、処理をステップ１５０２に戻す。
【００２５】
ステップ１５０８において、コンピュータは、全てのトランザクションの実行が終了していることに応じて、上記単純実装による方法の処理を終了する。
【００２６】
図１４に示したように、上記単純実装による方法では、あるトランザクションでアボートが起きると、それ以降のトランザクションについて、アボートが連鎖したり乃至は頻出したりしてしまうために性能が出なくなってしまう。
【００２７】
そこで、本発明は、順序付きトランザクションをサポートした特別なハードウェアでなく、一般的なハードウェア・トランザクション・メモリの機能を使用して複数のスレッドで順序付きトランザクションを実行した場合において、アボートの連鎖や頻出を防止することを目的とする。
【００２８】
非特許文献１は参照によって本明細書に取り込まれる。
【課題を解決するための手段】
【００２９】
本発明は、複数のスレッドで順序付きトランザクションを実行するための技法を提供する。当該技法は、上記トランザクションを実行するための方法、並びに、当該トランザクションを実行するためのコンピュータ、コンピュータ・プログラム及びコンピュータ・プログラム製品を包含しうる。
【００３０】
本発明に従う第１の態様において、複数のスレッドで順序付きトランザクションを実行する方法であって、コンピュータが、
複数のスレッドそれぞれのトランザクションの少なくとも１つにおいてアボートが起きたことを検出するステップと、
上記アボートが検出されたスレッドを含む少なくとも２つのスレッドをバリア同期するステップと
を実行することを含む。
【００３１】
本発明の一つの実施態様において、上記バリア同期するステップが、
上記アボートが検出された時点で処理中のトランザクションが全てコミットされるまで、前記複数のスレッド全てをバリア同期するステップ
を含みうる。
【００３２】
本発明の一つの実施態様において、上記バリア同期するステップが、
上記アボートが検出された時点で処理中のトランザクションが全てアボートされるまで、前記複数のスレッド全てをバリア同期するステップ
を含みうる。
【００３３】
本発明の一つの実施態様において、上記バリア同期するステップが、
上記アボートが検出された時点で処理中のトランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッド中のトランザクションが全てコミットされるまで、前記複数のスレッド全てをバリア同期するステップ
を含みうる。
【００３４】
本発明の一つの実施態様において、上記バリア同期するステップが、
上記アボートが検出された時点で処理中のトランザクションの実行順が遅い１つ又は複数のスレッドを除く前記複数のスレッド全て中のトランザクションが全てアボートされるまで、前記複数のスレッド全てをバリア同期するステップ
を含みうる。
【００３５】
本発明の一つの実施態様において、上記コンピュータが、
アボート率を計測するステップ
をさらに実行するステップを含み、
上記コンピュータが、
上記計測するステップで計測したアボート率が所定の閾値より低い場合に、上記検出するステップ及び上記バリア同期するステップを繰り返すステップ
をさらに実行することを含みうる。
【００３６】
本発明の一つの実施態様において、上記アボート率を計測するステップが、
上記アボートを検出することに応じて、
バリア同期が終了することに応じて、
所定の時間間隔で、又は、
所定量のトランザクションが処理されることに応じて
行われうる。
【００３７】
本発明に従う第２の態様において、複数のスレッドで順序付きトランザクションを実行するためのコンピュータであって、
複数のスレッドそれぞれのトランザクションの少なくとも１つにおいてアボートが起きたことを検出するアボート検出手段と、
上記アボートが検出されたスレッドを含む少なくとも２つのスレッドをバリア同期するバリア同期手段と
を備えている。
【００３８】
本発明の一つの実施態様において、上記バリア同期手段が、
上記アボートが検出された時点で処理中のトランザクションが全てコミットされるまで、前記複数のスレッド全てをバリア同期しうる。
【００３９】
本発明の一つの実施態様において、上記バリア同期手段が、
上記アボートが検出された時点で処理中のトランザクションが全てアボートされるまで、前記複数のスレッド全てをバリア同期しうる。
【００４０】
本発明の一つの実施態様において、上記バリア同期手段が、
上記アボートが検出された時点で処理中のトランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッド中のトランザクションが全てコミットされるまで、前記複数のスレッド全てをバリア同期しうる。
【００４１】
本発明の一つの実施態様において、上記バリア同期手段が、
上記アボートが検出された時点で処理中のトランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッド中のトランザクションが全てアボートされるまで、前記複数のスレッド全てをバリア同期しうる。
【００４２】
本発明の一つの実施態様において、上記コンピュータが、
アボート率を計測するアボート率計測手段
をさらに備えており、
上記コンピュータが、
上記アボート率計測手段で計測したアボート率が所定の閾値より低い場合に、上記検出すること及び上記バリア同期することを繰り返しうる。
【００４３】
本発明の一つの実施態様において、上記アボート率計測手段が、
上記アボートを検出することに応じて、
バリア同期が終了することに応じて、
所定の時間間隔で、又は、
所定量のトランザクションが処理されることに応じて
上記アボート率を計測しうる。
【００４４】
本発明に従う第３の態様において、複数のスレッドで順序付きトランザクションを実行するためのコンピュータ・プログラム又はコンピュータ・プログラム製品は、コンピュータに、上記第１の態様に記載の方法の各ステップを実行させる。
【００４５】
本発明の実施態様に従うコンピュータ・プログラムはそれぞれ、一つ又は複数のフレキシブル・ディスク、ＭＯ、ＣＤ−ＲＯＭ、ＤＶＤ、ＢＤ、ハードディスク装置、ＵＳＢに接続可能なメモリ媒体、ＲＯＭ、ＭＲＡＭ、ＲＡＭ等の任意のコンピュータ読み取り可能な記録媒体に格納することができる。当該コンピュータ・プログラムは、上記記録媒体への格納のために、通信回線で接続する他のコンピュータ、例えばサーバ・コンピュータからダウンロードしたり、又は他の記録媒体から複製したりすることができる。また、本発明の実施態様に従うコンピュータ・プログラムは、圧縮し、又は複数に分割して、単一又は複数の記録媒体に格納することもできる。また、様々な形態で、本発明の実施態様に従うコンピュータ・プログラム製品を提供することも勿論可能であることにも留意されたい。本発明の実施態様に従うコンピュータ・プログラム製品は、例えば、上記コンピュータ・プログラムを記録した記憶媒体、又は、上記コンピュータ・プログラムを伝送する伝送媒体を包含しうる。
【００４６】
本発明の上記概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの構成要素のコンビネーション又はサブコンビネーションもまた、本発明となりうることに留意すべきである。
【００４７】
本発明の実施態様において使用されるコンピュータの各ハードウェア構成要素を、複数のマシンと組み合わせ、それらに機能を配分し実施する等の種々の変更は当業者によって容易に想定され得ることは勿論である。それらの変更は、当然に本発明の思想に包含される概念である。ただし、これらの構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
【００４８】
また、本発明は、ハードウェア、ソフトウェア、又は、ハードウェア及びソフトウェアの組み合わせとして実現可能である。ハードウェアとソフトウェアとの組み合わせによる実行において、上記コンピュータ・プログラムのインストールされたコンピュータにおける実行が典型的な例として挙げられる。かかる場合、当該コンピュータ・プログラムが当該コンピュータのメモリにロードされて実行されることにより、当該コンピュータ・プログラムは、当該コンピュータを制御し、本発明の実施態様に従う方法の処理を実行させる。当該コンピュータ・プログラムは、任意の言語、コード、又は、表記によって表現可能な命令群から構成されうる。そのような命令群は、当該コンピュータが特定の機能を直接的に、又は、１．他の言語、コード若しくは表記への変換及び、２．他の媒体への複製、のいずれか一方若しくは双方が行われた後に、本発明の実施態様に従う処理を実行することを可能にするものである。
【発明の効果】
【００４９】
本発明の実施態様に従うと、複数のスレッドで順序付きトランザクションを実行した場合においてアボートの連鎖や頻出を防止することが可能になり、従って性能の向上をもたらす。
【図面の簡単な説明】
【００５０】
【図１】本発明の実施態様において使用されうるコンピュータの一例を示した図である。
【図２Ａ】本発明の実施態様に従う実施例１を示し、複数のスレッド中のトランザクションのうちの１つのトランザクションにおいてアボートが起きたことに応じて、当該アボートが連鎖することを防止するために、当該アボートが検出された時点で処理中のトランザクションが全てコミットされるまで、全てのスレッドがバリア同期される態様を示す。
【図２Ｂ】本発明の実施態様に従う実施例２を示し、各トランザクションの実行時間のばらつきが大きいプログラムの実行中にアボート率を計算し、複数のスレッド中のトランザクションのうちの１つのトランザクションにおいてアボートが起きたことに応じて、当該アボートが連鎖することを防止するために、上記計測したアボート率が所定の閾値より低いことを条件に、当該アボートが検出された時点で処理中のトランザクションが全てコミットされるまで、全てのスレッドがバリア同期される態様を示す。
【図３Ａ】本発明の実施態様に従う実施例３を示し、複数のスレッド中のトランザクションのうちの１つのトランザクションにおいてアボートが起きたことに応じて、当該アボートが連鎖することを防止するために、当該アボートが検出された時点で処理中のトランザクションが全てアボートされるまで、全てのスレッドがバリア同期される態様を示す。
【図３Ｂ】本発明の実施態様に従う実施例４を示し、各トランザクションの実行時間のばらつきが大きいプログラムの実行中にアボート率を計算し、複数のスレッド中のトランザクションのうちの１つのトランザクションにおいてアボートが起きたことに応じて、当該アボートが連鎖することを防止するために、上記計測したアボート率が所定の閾値より低いことを条件に、当該アボートが検出された時点で処理中のトランザクションが全てアボートされるまで、全てのスレッドがバリア同期される態様を示す。
【図４Ａ】本発明の実施態様に従う実施例５を示し、複数のスレッド中のトランザクションのうちの１つのトランザクションにおいてアボートが起きたことに応じて、当該アボートが連鎖することを防止するために、当該アボートが検出された時点で処理中のトランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッド中のトランザクションが全てコミットされるまで、上記トランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッドがバリア同期される態様を示す。
【図４Ｂ】本発明の実施態様に従う実施例６を示し、各トランザクションの実行時間のばらつきが大きいプログラムの実行中にアボート率を計算し、複数のスレッド中のトランザクションのうちの１つのトランザクションにおいてアボートが起きたことに応じて、当該アボートが連鎖することを防止するために、上記計測したアボート率が所定の閾値より低いことを条件に、当該アボートが検出された時点で処理中のトランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッド中のトランザクションが全てコミットされるまで、上記トランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッドがバリア同期される態様を示す。
【図５Ａ】本発明の実施態様に従う実施例７を示し、複数のスレッド中のトランザクションのうちの１つのトランザクションにおいてアボートが起きたことに応じて、当該アボートが連鎖することを防止するために、当該アボートが検出された時点で処理中のトランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッド中のトランザクションが全てアボートされるまで、上記トランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッドがバリア同期される態様を示す。
【図５Ｂ】本発明の実施態様に従う実施例８を示し、各トランザクションの実行時間のばらつきが大きいプログラムの実行中にアボート率を計算し、複数のスレッド中のトランザクションのうちの１つのトランザクションにおいてアボートが起きたことに応じて、当該アボートが連鎖することを防止するために、上記計測したアボート率が所定の閾値より低いことを条件に、当該アボートが検出された時点で処理中のトランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッド中のトランザクションが全てアボートされるまで、上記トランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッドがバリア同期される態様を示す。
【図６Ａ】本発明の実施態様に従う上記実施例１に示す実施態様を実行する為のフローチャートを示す。
【図６Ｂ】本発明の実施態様に従う上記実施例２に示す実施態様を実行する為のフローチャートを示す。
【図７Ａ】本発明の実施態様に従う上記実施例３に示す実施態様を実行する為のフローチャートを示す。
【図７Ｂ】本発明の実施態様に従う上記実施例４に示す実施態様を実行する為のフローチャートを示す。
【図８Ａ】本発明の実施態様に従う上記実施例５に示す実施態様を実行する為のフローチャートを示す。
【図８Ｂ】本発明の実施態様に従う上記実施例６に示す実施態様を実行する為のフローチャートを示す。
【図９Ａ】本発明の実施態様に従う上記実施例７に示す実施態様を実行する為のフローチャートを示す。
【図９Ｂ】本発明の実施態様に従う上記実施例８に示す実施態様を実行する為のフローチャートを示す。
【図１０】本発明の実施態様に従う上記実施例１及び上記実施例２それぞれにおけるベンチマーク結果を示す。
【図１１Ａ】本発明の実施態様に従う上記実施例１を実装する為のコード例を示す。
【図１１Ｂ】本発明の実施態様に従う上記実施例２を実装する為のコード例を示す。
【図１２】図１に従うハードウェア構成を好ましくは備えており、本発明の実施態様に従い複数のスレッドで順序付きトランザクションを実行するためのコンピュータの機能ブロック図の一例を示した図である。
【図１３】シングルスレッドによる各トランザクションの実行、及び、マルチスレッドによるスレッドレベル投機実行の従来技術を示す。
【図１４】一般のプロセッサに搭載されているハードウェア・トランザクショナル・メモリの機能を用いた順序付きトランザクションの単純実装による方法（従来技術）を示す。
【図１５】図１４に示す単純実装による方法を実行する為のフローチャートを示す。
【発明を実施するための形態】
【００５１】
本発明の実施形態を、以下に図面に従って説明する。以下の図を通して、特に断らない限り、同一の符号は同一の対象を指す。本発明の実施形態は、本発明の好適な態様を説明するためのものであり、本発明の範囲をここで示すものに限定する意図はないことを理解されたい。
【００５２】
本発明の実施態様において使用されうるコンピュータは、複数のスレッドで順序付きトランザクションを実行することができるコンピュータであれば特に限定されない。複数のスレッドで順序付きトランザクションを実行することは例えば、スレッドレベル投機によりトランザクションを実行することを含みうる。当該コンピュータは例えば、サーバ・コンピュータ、デスクトップ・コンピュータ、ノート・コンピュータ若しくは一体型パソコン、又は、タブレット端末若しくはスマートフォン端末でありうる。
【００５３】
図１は、本発明の実施態様において使用されうる上記コンピュータの一例を示した図である。
【００５４】
コンピュータ（１０１）は、ＣＰＵ（１０２）とメイン・メモリ（１０３）とを備えており、これらはバス（１０４）に接続されている。ＣＰＵ（１０２）は好ましくは、３２ビット又は６４ビットのアーキテクチャに基づくものである。当該ＣＰＵ（１０２）は例えば、インテル社のＣｏｒｅ（商標）  ｉシリーズ、Ｃｏｒｅ（商標）  ２シリーズ、Ａｔｏｍ（商標）シリーズ、Ｘｅｏｎ（登録商標）シリーズ、Ｐｅｎｔｉｕｍ（登録商標）シリーズ若しくはＣｅｌｅｒｏｎ（登録商標）シリーズ、ＡＭＤ（Advanced Micro Devices）社のＡシリーズ、Ｐｈｅｎｏｍ（商標）シリーズ、Ａｔｈｌｏｎ（商標）シリーズ、Ｔｕｒｉｏｎ（登録商標）シリーズ若しくはＳｅｍｐｒｏｎ（商標）、又は、インターナショナル・ビジネス・マシーンズ・コーポレーションのＰｏｗｅｒ（商標）シリーズでありうる。
【００５５】
バス（１０４）には、ディスプレイ・コントローラ（１０５）を介して、ディスプレイ（１０６）、例えば液晶ディスプレイ（ＬＣＤ）が接続されうる。また、液晶ディスプレイ（ＬＣＤ）は例えば、タッチパネル・ディスプレイ又はフローティング・タッチ・ディスプレイであてもよい。ディスプレイ（１０６）は、コンピュータ（１０１）上で動作中のソフトウェア（例えば、本発明の実施態様に従うコンピュータ・プログラム又は当該コンピュータ（１０１）上で動作中の各種コンピュータ・プログラム）が稼働することによって表示されるオブジェクトを、適当なグラフィック・インタフェースで表示するために使用されうる。また、ディスプレイ（１０６）は、本発明の実施態様により測定されたアボート率を出力しうる。
【００５６】
バス（１０４）には任意的に、例えばＳＡＴＡ又はＩＤＥコントローラ（１０７）を介して、ディスク（１０８）、例えばハードディスク又はソリッド・ステート・ドライブ（ＳＳＤ）が接続されうる。
【００５７】
バス（１０４）には任意的に、例えばＳＡＴＡ又はＩＤＥコントローラ（１０７）を介して、ドライブ（１０９）、例えばＣＤ、ＤＶＤ又はＢＤドライブが接続されうる。
【００５８】
バス（１０４）には、例えばキーボード・マウス・コントローラ（１１０）又はＵＳＢバスを介して、任意的に、キーボード（１１１）及びマウス（１１２）が接続されうる。
【００５９】
ディスク（１０８）には、オペレーティング・システム、例えばＷｉｎｄｏｗｓ（登録商標）、ＵＮＩＸ（登録商標）、ＭａｃＯＳ（登録商標）、アンドロイド（登録商標）、ｉＯＳ、Ｊ２ＥＥなどのＪａｖａ（登録商標）処理環境、Ｊａｖａ（登録商標）アプリケーション、Ｊａｖａ（登録商標）仮想マシン（ＶＭ）、Ｊａｖａ（登録商標）実行時（ＪＩＴ）コンパイラを提供するプログラム、本発明の実施態様に従うコンピュータ・プログラム、及びその他のプログラム、並びにデータが、メイン・メモリ（１０３）にロード可能なように記憶されうる。
【００６０】
ディスク（１０８）は、コンピュータ（１０１）内に内蔵されていてもよく、当該コンピュータ（１０１）がアクセス可能なようにケーブルを介して接続されていてもよく、又は、当該コンピュータ（１０１）がアクセス可能なように有線又は無線ネットワークを介して接続されていてもよい。
【００６１】
ドライブ（１０９）は、必要に応じて、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ又はＢＤからプログラム、例えばオペレーティング・システム、アプリケーション又は本発明の実施態様に従うコンピュータ・プログラムをディスク（１０８）にインストールするために使用されうる。
【００６２】
通信インタフェース（１１４）は、例えばイーサネット（登録商標）・プロトコルに従う。通信インタフェース（１１４）は、通信コントローラ（１１３）を介してバス（１０４）に接続され、コンピュータ（１０１）を通信回線（１１５）に有線又は無線接続する役割を担い、コンピュータ（１０１）のオペレーティング・システムの通信機能のＴＣＰ／ＩＰ通信プロトコルに対して、ネットワーク・インタフェース層を提供する。なお、通信回線は例えば、無線ＬＡＮ接続規格に基づく無線ＬＡＮ環境、ＩＥＥＥ８０２．１１ａ／ｂ／ｇ／ｎなどのＷｉ-Ｆｉ無線ＬＡＮ環境、又は携帯電話網環境（例えば、３Ｇ又は４Ｇ環境）でありうる。
【００６３】
下記図２Ａ〜図２Ｂ、図３Ａ〜図３Ｂ、図４Ａ〜図４Ｂ及び図５Ａ〜図５Ｂそれぞれは本発明の種々の実施態様を示し、複数のスレッドそれぞれのトランザクションの少なくとも１つにおいてアボートが起きたことが検出され、当該アボートが検出されたスレッドを含む少なくとも２つのスレッドがバリア同期される例を示す。当該実施態様において説明を容易にするためにスレッド数が３である場合を示すが、スレッド数は複数であればその数は制限されるものでないことに留意されたい。また、当該実施態様において各トランザクションの実行時間及び実行順序、並びにアボート時間も図示されている長さに制限されるものでないことに留意されたい。
【００６４】
本発明の実施態様において、「バリア同期」とは、複数のスレッドにおいて、各トランザクションを実行している場合に、全ての又は特定のスレッドを除く全てのスレッドにおいてトランザクションがコミット又はアボートされるまで実行されるが、全てのトランザクションがコミット又はアボートされるまでその先に実行が進行しないようなものをいう。
【００６５】
図２Ａは、本発明の実施態様に従う実施例１を示す。当該実施例１において、複数のスレッド中のトランザクションのうちの１つのトランザクションにおいてアボートが起きたことに応じて、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てコミットされるまで、全てのスレッドがバリア同期される。
【００６６】
図２Ａは、スレッド１〜スレッド３（２１１，２１２及び２１３）それぞれにおいて、各トランザクションが実行されていることを示す。各トランザクションは、実行時間のばらつきがそれほど大きくないもの（均一トランザクションともいう）とする。
【００６７】
コンピュータ（１０１）は、スレッド３（２１３）において、トランザクション６の終了直前において、当該トランザクション６の先行番号５を有するトランザクション５（スレッド２（２１２））がまだ終了していないので、トランザクション６それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション６がコミットされるべき順番にないことに応じて、当該トランザクション６をアボートする。コンピュータ（１０１）は、上記アボートを検出したことに応じて、全てのスレッドをバリア同期する為のバリア同期フラグを立てる。そして、コンピュータ（１０１）は、上記トランザクション６を再実行（「再実行６」と表記する）する。コンピュータ（１０１）は、スレッド３（２１３）において、当該再実行６が終了したこと（すなわち、再実行６がコミットされたこと）、且つ、上記バリア同期フラグが立っていることから、全てのスレッドがバリア同期（２２１）されるまで、スレッド３（２１３）において、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、上記バリア同期フラグが立っていることから、全てのスレッド（２１１〜２１３）において、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（下記トランザクション６、下記トランザクション７及び下記トランザクション８）が全てコミットされるまで、全てのスレッド（２１１〜２１３）をバリア同期（２２１）する。
【００６８】
コンピュータ（１０１）は、上記スレッド３（２１３）において上記トランザクション６についてのアボートが起きた後、当該アボートが起きたことを図２Ａに示す時点（アボート検出）で検出する。
【００６９】
コンピュータ（１０１）は、スレッド１（２１１）において、上記スレッド３（２１３）における上記アボートを検出した時点でトランザクション７を実行中である。コンピュータ（１０１）は、上記トランザクション７の終了直前において、当該トランザクション７の先行番号６を有するトランザクション６（スレッド３（２１３））がまだ終了していないので、上記トランザクション７それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション７がコミットされるべき順番にないことに応じて、当該トランザクション７をアボートする。コンピュータ（１０１）は、当該アボートを検出したことに応じて、全てのスレッドをバリア同期する為のバリア同期フラグを立てて（バリア同期フラグがすでに立っている場合であってもバリア同期フラグを再度立てる処理をするという態様である）、又は上記バリア同期フラグがすでに立っているのでバリア同期フラグを立てたと見なし、上記トランザクション７を再実行（「再実行７」と表記する）する。コンピュータ（１０１）は、当該再実行７が終了したこと（すなわち、再実行７がコミットされたこと）、且つ、上記バリア同期フラグが立っていることから、スレッド１（２１１）において、全てのスレッド（２１１〜２１３）がバリア同期（２２１）されるまで、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、上記バリア同期フラグが立っていることから、全てのスレッド（２１１〜２１３）において、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション６、トランザクション７及び下記トランザクション８）が全てコミットされるまで、全てのスレッド（２１１〜２１３）をバリア同期（２２１）する。
【００７０】
コンピュータ（１０１）は、スレッド２（２１２）において、上記スレッド３（２１３）における上記アボートを検出した時点でトランザクション８を実行中である。コンピュータ（１０１）は、上記トランザクション８の終了直前において、当該トランザクション８の先行番号７を有するトランザクション７（スレッド１（２１１））がまだ終了していないので、上記トランザクション８それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション８がコミットされるべき順番にないことに応じて、当該トランザクション８をアボートする。コンピュータ（１０１）は、当該アボートを検出したことに応じて、全てのスレッドをバリア同期する為のバリア同期フラグを立てて、又は上記バリア同期フラグがすでに立っているのでバリア同期フラグを立てたと見なし、トランザクション８を再実行（「再実行８」と表記する）する。コンピュータ（１０１）は、当該再実行８が終了したこと（すなわち、再実行８がコミットされたこと）に応じて、上記バリア同期フラグが立っており、且つ、当該アボートが検出された時点で処理中（実行中又はアボート）中のトランザクション（トランザクション６、トランザクション７及びトランザクション８）が全てコミットされていることから、上記バリア同期フラグを下げる。
【００７１】
コンピュータ（１０１）は、上記バリア同期フラグが下げられたことに応じて、バリア同期（２２１）を終了し、そして、全てのスレッド（２１１〜２１３）において、トランザクションの処理を再開する。なお、図２Ａにおいて、コンピュータ（１０１）が、スレッド１（２１１）においてトランザクション９を実行し、次に、スレッド２（２１２）においてトランザクション１０を実行し、次に、スレッド３（２１３）においてトランザクション１１を実行しているように示しているが、どのスレッドがどのトランザクションを実行するかは任意であって、上記に限定されるものでないことに留意されたい。
【００７２】
上記実施例１において、上記スレッド３（２１３）における上記アボートが検出された時点で実行中のトランザクションが全てコミットされるまで、全てのスレッド（２１１〜２１３）をバリア同期（２２１）することによって、当該アボートの連鎖が防止される。
【００７３】
図２Ｂは、本発明の実施態様に従う実施例２を示す。当該実施例２において、各トランザクションの実行時間のばらつきが大きいもの（不均一トランザクションともいう）においてアボート率を計算し、複数のスレッド中のトランザクションのうちの１つのトランザクションにおいてアボートが起きたことに応じて、上記計測したアボート率が所定の閾値より低いことを条件に、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てコミットされるまで、全てのスレッドがバリア同期される。
【００７４】
図２Ｂは、スレッド１〜スレッド３（２４１，２４２及び２４３）それぞれにおいて、各トランザクションが実行されていることを示す。各トランザクションは、実行時間のばらつきが大きいもの（不均一トランザクションともいう）とする。
【００７５】
コンピュータ（１０１）は、スレッド３（２４３）において、トランザクション３の終了直前において、当該トランザクション３の先行番号２を有するトランザクション２（スレッド２（２４２））がまだ終了していないので、上記トランザクション３それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション３がコミットされるべき順番にないことに応じて、当該トランザクション３をアボートする。コンピュータ（１０１）は、上記アボートを検出したことに応じて、全てのスレッドをバリア同期する為のバリア同期フラグを立てる。そして、コンピュータ（１０１）は、上記トランザクション３を再実行（「再実行３」と表記する）する。コンピュータ（１０１）は、上記再実行３の終了直前において、当該再実行３の先行番号２を有するトランザクション２（スレッド２（２４２））が終了しているので、当該再実行３をコミットする。次に、コンピュータ（１０１）は、上記バリア同期フラグが立っていることから、スレッド３（２４３）において、全てのスレッド（２４１〜２４３）でバリア同期（２５１）されるまで、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、上記バリア同期フラグが立っていることから、全てのスレッド（２４１〜２４３）において、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（下記トランザクション３、下記トランザクション４及び下記トランザクション５）が全てコミットされるまで、全てのスレッド（２４１〜２４３）をバリア同期（２５１）する。
【００７６】
コンピュータ（１０１）は、上記スレッド３（２４３）において上記トランザクション３についてのアボートが起きた後、当該アボートが起きたことを図２Ｂに示す時点（アボート検出１）で検出する。
【００７７】
コンピュータ（１０１）は、スレッド１（２４１）において、上記スレッド３（２４３）における上記トランザクション３についてのアボートを検出した時点でトランザクション４がアボート中である。コンピュータ（１０１）は、上記トランザクション４の終了直前において、当該トランザクション４の先行番号３を有するトランザクション３（スレッド３（２４３））がまだ終了していないので（アボート中）、上記トランザクション４それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション４がコミットされるべき順番にないことに応じて、当該トランザクション４をアボートする。コンピュータ（１０１）は、当該アボートを検出したことに応じて、全てのスレッドをバリア同期する為のバリア同期フラグを立てて、又は上記バリア同期フラグがすでに立っているのでバリア同期フラグを立てたと見なし、トランザクション４を再実行（「再実行４」と表記する）する。コンピュータ（１０１）は、上記再実行４の終了直前において、当該再実行４の先行番号３を有するトランザクション３（スレッド３（２４３））が終了しているので、当該再実行４をコミットする。次に、コンピュータ（１０１）は、当該再実行４が終了したこと（すなわち、再実行４がコミットされたこと）、且つ、上記バリア同期フラグが立っていることから、全てのスレッド（２４１〜２４３）でバリア同期（２５１）されるまで、スレッド１（２４１）において、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、上記バリア同期フラグが立っていることから、全てのスレッド（２４１〜２４３）において、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション３、トランザクション４及びトランザクション５）が全てコミットされるまで、全てのスレッド（２４１〜２４３）をバリア同期（２５１）する。
【００７８】
コンピュータ（１０１）は、スレッド２（２４２）において、上記スレッド３（２４３）における上記トランザクション３についてのアボートを検出した時点でトランザクション５を実行中である。コンピュータ（１０１）は、上記トランザクション５の終了直前において、上記トランザクション５の先行番号４を有するトランザクション４（スレッド１（２４１））がまだ終了していないので（アボート中）、当該トランザクション５それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション５がコミットされるべき順番にないことに応じて、当該トランザクション５をアボートする。コンピュータ（１０１）は、当該アボートを検出したことに応じて、全てのスレッドをバリア同期する為のバリア同期フラグを立てて、又は上記バリア同期フラグがすでに立っているのでバリア同期フラグを立てたと見なし、上記トランザクション５を再実行（「再実行５」と表記する）する。コンピュータ（１０１）は、上記再実行５の終了直前において、当該再実行５の先行番号４を有するトランザクション４（スレッド１（２４１））が終了しているので、当該再実行５をコミットする。次に、コンピュータ（１０１）は、当該再実行５が終了したこと（すなわち、当該再実行５がコミットされたこと）に応じて、上記バリア同期フラグが立っており、且つ、全てのスレッド（２４１〜２４３）において、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション３、トランザクション４及びトランザクション５）が全てコミットされていることから、上記バリア同期フラグを下げる。
【００７９】
上記実施例２において、上記スレッド３（２４３）における上記トランザクション３についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てコミットされるまで、全てのスレッド（２４１〜２４３）をバリア同期（２５１）することによって、当該アボートの連鎖が防止される。
【００８０】
コンピュータ（１０１）は例えば、（１）上記スレッド３（２４３）における上記トランザクション３についてのアボートを検出することに応じて、（２）バリア同期（２５１）が終了することに応じて、（３）所定の時間間隔で、又は（４）所定量のトランザクションが処理されることに応じて、アボート率を計算しうる。アボート率は例えば、アボートしたトランザクションの数をコミットしたトランザクション（再実行でコミットしたトランザクションを含む）の数で除した値、又は、アボートしたトランザクションの数をコミットの有無にかかわらず処理したトランザクション（再実行を含む）の数で除した値でありうる。当業者は、上記に示したアボート率を任意に選択しうる。
【００８１】
コンピュータ（１０１）は、上記バリア同期フラグが下げられたことに応じて、バリア同期（２５１）を終了する。そして、コンピュータ（１０１）は、上記アボート率が所定の閾値よりも低いことに応じて、引き続き、全てのスレッド（２４１〜２４３）において、トランザクションの処理を再開する。すなわち、コンピュータ（１０１）は、アボートを検出すること及びバリア同期をすることの処理を繰り返す。上記アボート率が所定の閾値よりも低いかを判断する理由は、各トランザクションの実行時間のばらつきが大きい場合に、アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てコミットされるまで全てのスレッド（２４１〜２４３）をバリア同期することで、却ってトランザクションの処理が遅くなりうる場合もあるからである。
【００８２】
なお、図２Ｂにおいて、コンピュータ（１０１）が、スレッド１（２４１）においてトランザクション６を実行し、次に、スレッド２（２４２）においてトランザクション７を実行し、次に、スレッド３（２４３）においてトランザクション８を実行しているように示しているが、どのスレッドがどのトランザクションを実行するかは任意であって、上記に限定されるものでないことに留意されたい。
【００８３】
引き続き、コンピュータ（１０１）は、スレッド２（２４２）において、トランザクション７の終了直前において、当該トランザクション７の先行番号６を有するトランザクション６（スレッド１（２４１））がまだ終了していないので、上記トランザクション７それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション７がコミットされるべき順番にないことに応じて、当該トランザクション７をアボートする。コンピュータ（１０１）は、上記アボートを検出したことに応じて、全てのスレッド（２４１〜２４３）をバリア同期する為のバリア同期フラグを立てる。そして、コンピュータ（１０１）は、上記トランザクション７を再実行（「再実行７」と表記する）する。コンピュータ（１０１）は、上記再実行７の終了直前において、当該再実行７の先行番号６を有するトランザクション６（スレッド１（２４１））が終了しているので、当該再実行７をコミットする。次に、コンピュータ（１０１）は、上記バリア同期フラグが立っていることから、スレッド２（２４２）において、全てのスレッド（２４１〜２４３）でバリア同期（２５２）されるまで、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、上記バリア同期フラグが立っていることから、全てのスレッド（２４１〜２４３）において、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（下記トランザクション７、下記トランザクション８及び下記トランザクション９）が全てコミットされるまで、全てのスレッド（２４１〜２４３）をバリア同期（２５２）する。
【００８４】
コンピュータ（１０１）は、上記スレッド２（２４２）において上記トランザクション７についてのアボートが起きた後、当該アボートが起きたことを図２Ｂに示す時点（アボート検出２）で検出する。
【００８５】
コンピュータ（１０１）は、スレッド３（２４３）において、上記スレッド２（２４２）における上記トランザクション７についてのアボートを検出した時点でトランザクション８がアボート中である。コンピュータ（１０１）は、上記トランザクション８の終了直前において、当該トランザクション８の先行番号７を有するトランザクション７（スレッド２（２４２））がまだ終了していないので（アボート中）、上記トランザクション８それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション８がコミットされるべき順番にないことに応じて、当該トランザクション８をアボートする。コンピュータ（１０１）は、当該アボートを検出したことに応じて、全てのスレッドをバリア同期する為のバリア同期フラグを立てて、又は上記バリア同期フラグがすでに立っているのでバリア同期フラグを立てたと見なし、トランザクション８を再実行（「再実行８」と表記する）する。コンピュータ（１０１）は、上記再実行８の終了直前において、当該再実行８の先行番号７を有する再実行７（スレッド２（２４２））が終了しているので、当該再実行８をコミットする。次に、コンピュータ（１０１）は、当該再実行８が終了したこと（すなわち、再実行８がコミットされたこと）、且つ、上記バリア同期フラグが立っていることから、全てのスレッド（２４１〜２４３）でバリア同期（２５２）されるまで、スレッド３（２４３）において、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、上記バリア同期フラグが立っていることから、全てのスレッド（２４１〜２４３）において、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション６、トランザクション７及びトランザクション８）が全てコミットされるまで、全てのスレッド（２４１〜２４３）をバリア同期（２５２）する。
【００８６】
コンピュータ（１０１）は、スレッド１（２４１）において、上記スレッド２（２４２）における上記トランザクション７についてのアボートを検出した時点でトランザクション９を実行中である。コンピュータ（１０１）は、上記トランザクション９の終了直前において、上記トランザクション９の先行番号８を有するトランザクション８（スレッド３（２４３））がまだ終了していないので（アボート中）、当該トランザクション９それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション９がコミットされるべき順番にないことに応じて、当該トランザクション９をアボートする。コンピュータ（１０１）は、当該アボートを検出したことに応じて、全てのスレッドをバリア同期する為のバリア同期フラグを立てて、又は上記バリア同期フラグがすでに立っているのでバリア同期フラグを立てたと見なし、上記トランザクション９を再実行（「再実行９」と表記する）する。コンピュータ（１０１）は、上記再実行９の終了直前において、当該再実行９の先行番号８を有する再実行８（スレッド１（２４３））が終了しているので、当該再実行９をコミットする。次に、コンピュータ（１０１）は、当該再実行９が終了したこと（すなわち、当該再実行９がコミットされたこと）に応じて、上記バリア同期フラグが立っており、且つ、全てのスレッド（２４１〜２４３）において、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション６、トランザクション７及びトランザクション８）が全てコミットされていることから、上記バリア同期フラグを下げる。
【００８７】
コンピュータ（１０１）は例えば、（１）上記スレッド２（２４２）における上記トランザクション７についてのアボートを検出することに応じて、（２）バリア同期（２５２）が終了することに応じて、（３）所定の時間間隔で、又は（４）所定量のトランザクションが処理されることに応じて、アボート率を計算しうる。
【００８８】
コンピュータ（１０１）は、上記バリア同期フラグが下げられたことに応じて、バリア同期（２５２）を終了する。そして、コンピュータ（１０１）は、上記アボート率が所定の閾値よりも低いことに応じて、引き続き、全てのスレッド（２４１〜２４３）において、トランザクションの処理を再開する（図示せず）。すなわち、コンピュータ（１０１）は、アボートを検出すること及びバリア同期をすることの処理を繰り返す。
【００８９】
上記実施例２において、上記アボート率が所定の閾値よりも低いことに応じて、上記スレッド２（２４２）における上記トランザクション７についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てコミットされるまで、全てのスレッド（２４１〜２４３）をバリア同期（２５２）することによって、当該アボートの連鎖が防止される。
【００９０】
図３Ａは、本発明の実施態様に従う実施例３を示す。当該実施例３において、複数のスレッド中のトランザクションのうちの１つのトランザクションにおいてアボートが起きたことに応じて、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てアボートされるまで、全てのスレッドがバリア同期される。
【００９１】
図３Ａは、スレッド１〜スレッド３（３１１，３１２及び３１３）それぞれにおいて、各トランザクションが実行されていることを示す。各トランザクションは、実行時間のばらつきがそれほど大きくないもの（均一トランザクションともいう）とする。
【００９２】
コンピュータ（１０１）は、スレッド３（３１３）において、トランザクション６の終了直前において、当該トランザクション６の先行番号５を有するトランザクション５（スレッド２（３１２））がまだ終了していないので、上記トランザクション６それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション６がコミットされるべき順番にないことに応じて、当該トランザクション６をアボートする。コンピュータ（１０１）は、上記アボートを検出したことに応じて、全てのスレッド（３１１〜３１３）がバリア同期（３２１）されるまで、スレッド３（３１３）において、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、全てのスレッド（３１１〜３１３）において、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション６、下記トランザクション７及び下記トランザクション８）が全てアボートされるまで、全てのスレッド（３１１〜３１３）をバリア同期（３２１）する。なお、当該実施例３において、バリア同期するかを判断するステップと実際にバリア同期するステップとが同じ（下記図７Ａのステップ７１１を参照）である為に、全てのスレッドをバリア同期する為のバリア同期フラグを必ずしも立てる必要は無い。
【００９３】
コンピュータ（１０１）は、上記スレッド３（３１３）において上記トランザクション６についてのアボートが起きた後、当該アボートが起きたことを図３Ａに示す時点（アボート検出）で検出する。
【００９４】
コンピュータ（１０１）は、スレッド１（３１１）において、上記スレッド３（３１３）における上記トランザクション６についてのアボートを検出した時点でトランザクション７を実行中である。コンピュータ（１０１）は、上記トランザクション７の終了直前において、当該トランザクション７の先行番号６を有するトランザクション６（スレッド３（３１３））がまだ終了していないので（バリア同期中）、上記トランザクション７それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション７がコミットされるべき順番にないことに応じて、当該トランザクション７をアボートする。コンピュータ（１０１）は、全てのスレッド（３１１〜３１３）でバリア同期（３２１）されるまで、スレッド１（３１１）において、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、全てのスレッド（３１１〜３１３）において、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション６、トランザクション７及び下記トランザクション８）が全てアボートされるまで、全てのスレッド（３１１〜３１３）をバリア同期（３２１）する。
【００９５】
コンピュータ（１０１）は、スレッド２（３１２）において、上記スレッド３（３１３）における上記トランザクション６についてのアボートを検出した時点でトランザクション８を実行中である。コンピュータ（１０１）は、上記トランザクション８の終了直前において、当該トランザクション８の先行番号７を有するトランザクション７（スレッド１（３１１））がまだ終了していないので（実行中）、上記トランザクション８それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション８がコミットされるべき順番にないことに応じて、当該トランザクション８をアボートする。
【００９６】
コンピュータ（１０１）は、上記トランザクション８がアボートされることに応じて、上記スレッド３（３１３）における上記トランザクション６についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション６、トランザクション７及びトランザクション８）が全てアボートされていることから、バリア同期（３２１）を終了する。
【００９７】
コンピュータ（１０１）は、上記バリア同期（３２１）が終了したことに応じて、全てのスレッド（３１１〜３１３）において、トランザクションの処理を再開する。すなわち、コンピュータ（１０１）は、アボートを検出すること及びバリア同期をすることの処理を繰り返す。
【００９８】
なお、図３Ａにおいて、コンピュータ（１０１）が、スレッド１（３１１）においてトランザクション６を再実行（「再実行６」と表記する）し、次に、スレッド２（３１２）においてトランザクション７を再実行（「再実行７」と表記する）し、次に、スレッド３（３１３）においてトランザクション８を再実行（「再実行８」と表記する）するように示しているが、どのスレッドがどのトランザクションを再実行するかは任意であって、上記に限定されるものでないことに留意されたい。
【００９９】
上記実施例３において、上記スレッド３（３１３）における上記トランザクション６についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション６、トランザクション７及びトランザクション８）が全てアボートされるまで、全てのスレッド（３１１〜３１３）をバリア同期（３２１）することによって、当該アボートの連鎖が防止される。
【０１００】
図３Ｂは、本発明の実施態様に従う実施例４を示す。当該実施例４において、各トランザクションの実行時間のばらつきが大きいプログラムの実行中にアボート率を計算し、複数のスレッド中のトランザクションのうちの１つのトランザクションにおいてアボートが起きたことに応じて、上記計測したアボート率が所定の閾値より低いことを条件に、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てアボートされるまで、全てのスレッドがバリア同期される。
【０１０１】
図３Ｂは、スレッド１〜スレッド３（３４１，３４２及び３４３）それぞれにおいて、各トランザクションが実行されていることを示す。各トランザクションは、実行時間のばらつきが大きいもの（不均一トランザクションともいう）とする。
【０１０２】
コンピュータ（１０１）は、スレッド３（３４３）において、トランザクション３の終了直前において、当該トランザクション３の先行番号２を有するトランザクション２（スレッド２（３４２））がまだ終了していないので、上記トランザクション３それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション３がコミットされるべき順番にないことに応じて、当該トランザクション３をアボートする。コンピュータ（１０１）は、スレッド３（３４３）において上記トランザクション３についてのアボートを検出したことに応じて、全てのスレッド（３４１〜３４３）がバリア同期（３５１）されるまで、スレッド３（３４３）において、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、全てのスレッド（３４１〜３４３）において、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション３、下記トランザクション４及び下記トランザクション５）が全てアボートされるまで、全てのスレッド（３４１〜３４３）をバリア同期（３５１）する。なお、当該実施例４において、バリア同期するかを判断するステップと実際にバリア同期するステップとが同じ（下記図７Ｂのステップ７３１を参照）である為に、全てのスレッドをバリア同期する為のバリア同期フラグを必ずしも立てる必要は無い。
【０１０３】
コンピュータ（１０１）は、上記スレッド３（３４３）において上記トランザクション３についてのアボートが起きた後、当該アボートが起きたことを図３Ｂに示す時点（アボート検出１）で検出する。
【０１０４】
コンピュータ（１０１）は、スレッド１（３４１）において、上記スレッド３（３４３）における上記トランザクション３についてのアボートを検出した時点でトランザクション４がアボート中である。コンピュータ（１０１）は、全てのスレッド（３４１〜３４３）でバリア同期（３５１）されるまで、スレッド１（３４１）において、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、全てのスレッド（３４１〜３４３）において、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション３、トランザクション４及び下記トランザクション５）が全てアボートされるまで、全てのスレッド（３４１〜３４３）をバリア同期（３５１）する。
【０１０５】
コンピュータ（１０１）は、スレッド２（３４２）において、上記スレッド３（３４３）における上記トランザクション３についてのアボートを検出した時点でトランザクション５を実行中である。コンピュータ（１０１）は、上記トランザクション５の終了直前において、当該トランザクション５の先行番号４を有するトランザクション４（スレッド１（３４１））がまだ終了していないので（アボート中）、上記トランザクション５それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション５がコミットされるべき順番にないことに応じて、当該トランザクション５をアボートする。
【０１０６】
コンピュータ（１０１）は、上記トランザクション５のアボートに応じて、上記スレッド３（３４３）における上記トランザクション３についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション３、トランザクション４及びトランザクション５）が全てアボートされていることから、バリア同期（３５１）を終了する。
【０１０７】
上記実施例４において、上記スレッド３（３４３）における上記トランザクション３についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てアボートされるまで、全てのスレッド（３４１〜３４３）をバリア同期（３５１）することによって、当該アボートの連鎖が防止される。
【０１０８】
コンピュータ（１０１）は例えば、（１）上記スレッド３（３４３）における上記トランザクション３についてのアボートを検出することに応じて、（２）バリア同期（３５１）が終了することに応じて、（３）所定の時間間隔で、又は（４）所定量のトランザクションが処理されることに応じて、アボート率を計算しうる。当業者は、図２Ｂの説明において定義したアボート率を任意に選択しうる。
【０１０９】
コンピュータ（１０１）は、上記アボート率が所定の閾値よりも低いことに応じて、引き続き、全てのスレッド（３４１〜３４３）において、トランザクションの処理を再開する。すなわち、コンピュータ（１０１）は、アボートを検出すること及びバリア同期をすることの処理を繰り返す。上記アボート率が所定の閾値よりも低いかを判断する理由は、各トランザクションの実行時間のばらつきが大きい場合に、アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てアボートされるまで全てのスレッドをバリア同期することで、却ってトランザクションの処理が遅くなりうる場合もあるからである。
【０１１０】
なお、図３Ｂにおいて、コンピュータ（１０１）が、スレッド１（３４１）においてトランザクション３を再実行（「再実行３」と表記する）し、次に、スレッド２（３４２）においてトランザクション４を再実行（「再実行４」と表記する）し、次に、スレッド３（３４３）においてトランザクション５を再実行（「再実行５」と表記する）するように示しているが、どのスレッドがどのトランザクションを実行するかは任意であって、上記に限定されるものでないことに留意されたい。
【０１１１】
引き続き、コンピュータ（１０１）は、スレッド３（３４３）において、再実行５の終了直前において、当該再実行５の先行番号４を有する再実行４（スレッド２（３４２））がまだ終了していないので、上記再実行５それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記再実行５がコミットされるべき順番にないことに応じて、当該再実行５をアボートする。コンピュータ（１０１）は、スレッド３（３４３）において上記再実行５についてのアボートを検出したことに応じて、全てのスレッド（３４１〜３４３）がバリア同期（３５２）されるまで、スレッド３（３４３）において、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、全てのスレッド（３４１〜３４３）において、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（再実行５、下記トランザクション６及び下記トランザクション７）が全てアボートされるまで、全てのスレッド（３４１〜３４３）をバリア同期（３５２）する。
【０１１２】
コンピュータ（１０１）は、上記スレッド３（３４３）において上記再実行５についてのアボートが起きた後、当該アボートが起きたことを図３Ｂに示す時点（アボート検出２）で検出する。
【０１１３】
コンピュータ（１０１）は、スレッド２（３４２）において、上記スレッド３（３４３）における上記再実行５についてのアボートを検出した時点でトランザクション７を実行中である。コンピュータ（１０１）は、上記トランザクション７の終了直前において、当該トランザクション７の先行番号６を有するトランザクション６（スレッド１（３４１））がまだ終了していないので（実行中）、上記トランザクション７それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション７がコミットされるべき順番にないことに応じて、当該トランザクション７をアボートする。コンピュータ（１０１）は、全てのスレッド（３４１〜３４３）でバリア同期（３５２）されるまで、スレッド１（３４１）において、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、全てのスレッド（３４１〜３４３）において、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（再実行５、トランザクション６及び下記トランザクション７）が全てアボートされるまで、全てのスレッド（３４１〜３４３）をバリア同期（３５２）する。
【０１１４】
コンピュータ（１０１）は、スレッド１（３４１）において、上記スレッド３（３４３）における上記再実行５についてのアボートを検出した時点でトランザクション６が実行中である。コンピュータ（１０１）は、上記トランザクション６の終了直前において、当該トランザクション６の先行番号５を有する再実行５（スレッド３（３４３））がまだ終了していないので（アボート中）、上記トランザクション６それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション６がコミットされるべき順番にないことに応じて、当該トランザクション６をアボートする。
【０１１５】
コンピュータ（１０１）は、上記トランザクション６のアボートに応じて、上記スレッド３（３４３）における上記トランザクション３についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（再実行５、トランザクション６及びトランザクション７）が全てアボートされていることから、バリア同期（３５２）を終了する。
【０１１６】
上記実施例４において、上記アボート率が所定の閾値よりも低いことに応じて、上記スレッド３（３４３）における上記再実行５についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てアボートされるまで、全てのスレッド（３４１〜３４３）をバリア同期（３５２）することによって、当該アボートの連鎖が防止される。
【０１１７】
コンピュータ（１０１）は例えば、（１）上記スレッド３（３４３）における上記再実行５についてのアボートを検出することに応じて、（２）バリア同期（３５２）が終了することに応じて、（３）所定の時間間隔で、又は（４）所定量のトランザクションが処理されることに応じて、アボート率を計算しうる。
【０１１８】
コンピュータ（１０１）は、上記アボート率が所定の閾値よりも低いことに応じて、引き続き、全てのスレッド（３４１〜３４３）において、トランザクションの処理を再開する。すなわち、コンピュータ（１０１）は、アボートを検出すること及びバリア同期をすることの処理を繰り返す。
【０１１９】
なお、図３Ｂにおいて、コンピュータ（１０１）が、スレッド１（３４１）においてトランザクション５を再実行（「再実行５」と表記する）し、次に、スレッド２（３４２）においてトランザクション６を再実行（「再実行６」と表記する）し、次に、スレッド３（３４３）においてトランザクション７を再実行（「再実行７」と表記する）するように示しているが、どのスレッドがどのトランザクションを実行するかは任意であって、上記に限定されるものでないことに留意されたい。
【０１２０】
図４Ａは、本発明の実施態様に従う実施例５を示す。当該実施例５において、複数のスレッド中のトランザクションのうちの１つのトランザクションにおいてアボートが起きたことに応じて、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッド中のトランザクションが全てコミットされるまで、上記トランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッドがバリア同期される。
【０１２１】
図４Ａは、スレッド１〜スレッド３（４１１，４１２及び４１３）それぞれにおいて、各トランザクションが実行されていることを示す。各トランザクションは、実行時間のばらつきがそれほど大きくないもの（均一トランザクションともいう）とする。
【０１２２】
コンピュータ（１０１）は、スレッド３（４１３）において、トランザクション６の終了直前において、当該トランザクション６の先行番号５を有するトランザクション５（スレッド２（４１２））がまだ終了していないので、トランザクション６それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション６がコミットされるべき順番にないことに応じて、当該トランザクション６をアボートする。コンピュータ（１０１）は、上記アボートを検出したことに応じて、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅いスレッドを除く全てのスレッドをバリア同期する為のバリア同期フラグを立てる。そして、コンピュータ（１０１）は、上記トランザクション６を再実行（「再実行６」と表記する）する。コンピュータ（１０１）は、スレッド３（４１３）において、当該再実行６が終了したこと（すなわち、再実行６がコミットされたこと）、且つ、上記バリア同期フラグが立っていることから、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッドがバリア同期（４２１）されるまで、スレッド３（４１３）において、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、上記バリア同期フラグが立っていることから、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション６、下記トランザクション７及び下記トランザクション８）の実行順が遅いスレッド２（トランザクション８を実行中である）（４１２）を除く全てのスレッド（スレッド１（４１１）及びスレッド３（４１３））中のトランザクションが全てコミットされるまで、上記スレッド２（４１２）を除く全てのスレッド（スレッド１（４１１）及びスレッド３（４１３））をバリア同期（４２１）する。
【０１２３】
コンピュータ（１０１）は、上記スレッド３（４１３）において上記トランザクション６についてのアボートが起きた後、当該アボートが起きたことを図４Ａに示す時点（アボート検出）で検出する。
【０１２４】
コンピュータ（１０１）は、スレッド１（４１１）において、上記スレッド３（４１３）における上記アボートを検出した時点でトランザクション７を実行中である。コンピュータ（１０１）は、上記トランザクション７の終了直前において、当該トランザクション７の先行番号６を有するトランザクション６（スレッド３（４１３））がまだ終了していないので、上記トランザクション７それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション７がコミットされるべき順番にないことに応じて、当該トランザクション７をアボートする。コンピュータ（１０１）は、当該アボートを検出したことに応じて、全てのスレッドをバリア同期する為のバリア同期フラグを立てて、又は上記バリア同期フラグがすでに立っているのでバリア同期フラグを立てたと見なし、上記トランザクション７を再実行（「再実行７」と表記する）する。コンピュータ（１０１）は、当該再実行７が終了したこと（すなわち、再実行７がコミットされたこと）に応じて、上記バリア同期フラグが立っており、且つ、スレッド２（４１２）を除く全てのスレッド（スレッド１（４１１）及びスレッド３（４１３））中のトランザクション（再実行６及び再実行７）が全てコミットされていることから、バリア同期（４２１）を終了する。
【０１２５】
コンピュータ（１０１）は、スレッド２（４１２）において、上記スレッド３（４１３）における上記アボートを検出した時点でトランザクション８を実行中である。コンピュータ（１０１）は、上記トランザクション８の終了直前において、当該トランザクション８の先行番号７を有するトランザクション７（スレッド１（４１１））がまだ終了していないので、上記トランザクション８それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション８がコミットされるべき順番にないことに応じて、当該トランザクション８をアボートする。コンピュータ（１０１）は、上記バリア同期フラグがすでに立っているが、スレッド２（４１２）はバリア同期（４２１）の対象でないことから、引き続き再実行８を実行する。コンピュータ（１０１）は、上記トランザクション８の終了直前において、当該トランザクション８の先行番号７を有する再実行７（スレッド１（４１１））が終了しているので、上記トランザクション８それ自身がコミットされるべき順番にあると判断し、当該トランザクション８をコミットする。
【０１２６】
コンピュータ（１０１）は、上記バリア同期（４２１）が終了したことに応じて、上記スレッド２（４１２）を除く全てのスレッド（スレッド１（４１１）及びスレッド３（４１３））において、トランザクションの処理を再開する。すなわち、コンピュータ（１０１）は、アボートを検出すること及びバリア同期をすることの処理を繰り返す。
【０１２７】
なお、図４Ａにおいて、コンピュータ（１０１）が、スレッド１（４１１）においてトランザクション９を実行し、次に、スレッド３（４１３）においてトランザクション１０を実行しているように示しているが、いずれかのスレッドがどのトランザクションを実行するかは任意であって、上記に限定されるものでないことに留意されたい。
【０１２８】
上記実施例５において、上記スレッド３（４１３）における上記トランザクション６についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅いスレッド２（４１２）を除く全てのスレッド（スレッド１（４１１）及びスレッド３（４１３））中のトランザクションが全てコミットされるまで、スレッド２（４１２）を除く全てのスレッド（スレッド１（４１１）及びスレッド３（４１３））をバリア同期（４２１）することによって、当該アボートの連鎖が防止される。
【０１２９】
図４Ｂは、本発明の実施態様に従う実施例６を示す。当該実施例６において、各トランザクションの実行時間のばらつきが大きいプログラムの実行中にアボート率を計算し、複数のスレッド中のトランザクションのうちの１つのトランザクションにおいてアボートが起きたことに応じて、上記計測したアボート率が所定の閾値より低いことを条件に、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッド中のトランザクションが全てコミットされるまで、上記トランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッドがバリア同期される。
【０１３０】
図４Ｂは、スレッド１〜スレッド３（４４１，４４２及び４４３）それぞれにおいて、各トランザクションが実行されていることを示す。各トランザクションは、実行時間のばらつきが大きいもの（不均一トランザクションともいう）とする。
【０１３１】
コンピュータ（１０１）は、スレッド３（４４３）において、トランザクション３の終了直前において、当該トランザクション３の先行番号２を有するトランザクション２（スレッド２（４４２））がまだ終了していないので、上記トランザクション３それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション３がコミットされるべき順番にないことに応じて、当該トランザクション３をアボートする。コンピュータ（１０１）は、スレッド３（４４３）において上記トランザクション３についてのアボートを検出したことに応じて、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅いスレッドを除く全てのスレッドをバリア同期する為のバリア同期フラグを立てる。そして、コンピュータ（１０１）は、上記トランザクション３を再実行（「再実行３」と表記する）する。コンピュータ（１０１）は、スレッド３（４４３）において、当該再実行３が終了したこと（すなわち、再実行３がコミットされたこと）、且つ、上記バリア同期フラグが立っていることから、上記アボートが検出された時点で実行中又はアボート中のトランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッドがバリア同期（４５１）されるまで、スレッド３（４４３）において、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、上記バリア同期フラグが立っていることから、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（下記トランザクション３、下記トランザクション４及び下記トランザクション５）の実行順が遅いスレッド２（トランザクション５を実行中である）（４４２）を除く全てのスレッド（スレッド１（４４１）及びスレッド３（４４３））中のトランザクションが全てコミットされるまで、上記スレッド２（４４２）を除く全てのスレッド（スレッド１（４４１）及びスレッド３（４４３））をバリア同期（４５１）する。
【０１３２】
コンピュータ（１０１）は、上記スレッド３（４４３）において上記トランザクション３についてのアボートが起きた後、当該アボートが起きたことを図４Ｂに示す時点（アボート検出１）で検出する。
【０１３３】
コンピュータ（１０１）は、スレッド１（４４１）において、上記スレッド３（４４３）における上記アボートを検出した時点でトランザクション４についてアボート中である。なぜならば、コンピュータ（１０１）は、上記トランザクション４の終了直前において、当該トランザクション４の先行番号３を有するトランザクション３（スレッド３（４４３））がまだ終了していないので、上記トランザクション４それ自身がコミットされるべき順番にないと判断し、そして、上記トランザクション４がコミットされるべき順番にないことに応じて、当該トランザクション４をアボートするからである。コンピュータ（１０１）は、当該アボートを検出したことに応じて、全てのスレッドをバリア同期する為のバリア同期フラグを立てて、又は上記バリア同期フラグがすでに立っているのでバリア同期フラグを立てたと見なし、上記トランザクション４を再実行（「再実行４」と表記する）する。コンピュータ（１０１）は、当該再実行４が終了したこと（すなわち、再実行４がコミットされたこと）に応じて、上記バリア同期フラグが立っており、且つ、上記スレッド２（４４２）を除く全てのスレッド（スレッド１（４４１）及びスレッド３（４４３））中のトランザクション（再実行３及び再実行４）が全てコミットされていることから、バリア同期フラグを下げて、バリア同期（４５１）を終了する。
【０１３４】
コンピュータ（１０１）は、スレッド２（４４２）において、上記スレッド３（４４３）における上記アボートを検出した時点でトランザクション５を実行中である。コンピュータ（１０１）は、上記トランザクション５の終了直前において、当該トランザクション５の先行番号４を有するトランザクション４（スレッド１（４４１））がまだ終了していないので、上記トランザクション５それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション５がコミットされるべき順番にないことに応じて、当該トランザクション５をアボートする。コンピュータ（１０１）は、上記バリア同期フラグがすでに立っているが、スレッド２（４４２）はバリア同期（４５１）の対象でないことから、引き続き再実行５を実行する。コンピュータ（１０１）は、上記トランザクション５の終了直前において、当該トランザクション５の先行番号４を有する再実行４（スレッド１（４４１））が終了しているので、上記再実行５それ自身がコミットされるべき順番にあると判断し、当該再実行５をコミットする。
【０１３５】
上記実施例６において、上記スレッド３（４４３）における上記トランザクション３についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅いスレッド２（４４２）を除く全てのスレッド（スレッド１（４４１）及びスレッド３（４４３））中のトランザクションが全てアボートされるまで、上記スレッド２（４４２）を除く全てのスレッド（スレッド１（４４１）及びスレッド３（４４３））をバリア同期（４５１）することによって、当該アボートの連鎖が防止される。
【０１３６】
コンピュータ（１０１）は例えば、（１）上記スレッド３（４４３）における上記トランザクション３についてのアボートを検出することに応じて、（２）バリア同期（４５１）が終了することに応じて、（３）所定の時間間隔で、又は（４）所定量のトランザクションが処理されることに応じて、アボート率を計算しうる。当業者は、図２Ａの説明において定義したアボート率を任意に選択しうる。
【０１３７】
コンピュータ（１０１）は、上記アボート率が所定の閾値よりも低いことに応じて、引き続き、スレッド２（４４２）を除く全てのスレッド（スレッド１（４４１）及びスレッド３（４４３））において、トランザクションの処理を再開する。すなわち、コンピュータ（１０１）は、アボートを検出すること及びバリア同期をすることの処理を繰り返す。上記アボート率が所定の閾値よりも低いかを判断する理由は、各トランザクションの実行時間のばらつきが大きい場合に、アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てコミットされるまで全てのスレッドをバリア同期することで、却ってトランザクションの処理が遅くなりうる場合もあるからである。
【０１３８】
なお、図４Ｂにおいて、コンピュータ（１０１）が、スレッド１（４４１）においてトランザクション６を実行し、次に、スレッド３（４４３）においてトランザクション７を実行するように示しているが、どのスレッドがどのトランザクションを実行するかは任意であって、上記に限定されるものでないことに留意されたい。
【０１３９】
引き続き、コンピュータ（１０１）は、スレッド３（４４３）において、トランザクション７の終了直前において、当該トランザクション７の先行番号６を有するトランザクション６（スレッド１（４４１））がまだ終了していないので、上記トランザクション７それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション７がコミットされるべき順番にないことに応じて、当該トランザクション７をアボートする。コンピュータ（１０１）は、スレッド３（４４３）において上記トランザクション７についてのアボートを検出したことに応じて、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅いスレッドを除く全てのスレッドをバリア同期する為のバリア同期フラグを立てる。そして、コンピュータ（１０１）は、上記トランザクション７を再実行（「再実行７」と表記する）する。コンピュータ（１０１）は、スレッド３（４４３）において、当該再実行７が終了したこと（すなわち、再実行７がコミットされたこと）、且つ、上記バリア同期フラグが立っていることから、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッドがバリア同期（４５２）されるまで、スレッド３（４４３）において、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、上記バリア同期フラグが立っていることから、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション７、下記トランザクション８及び下記トランザクション９）の実行順が遅いスレッド１（トランザクション９を実行中である）（４４１）を除く全てのスレッド（スレッド２（４４２）及びスレッド３（４４３））中のトランザクションが全てコミットされるまで、上記スレッド１（４４１）を除く全てのスレッド（スレッド２（４４２）及びスレッド３（４４３））をバリア同期（４５２）する。
【０１４０】
コンピュータ（１０１）は、上記スレッド３（４４３）において上記トランザクション７についてのアボートが起きた後、当該アボートが起きたことを図４Ｂに示す時点（アボート検出２）で検出する。
【０１４１】
コンピュータ（１０１）は、スレッド２（４４２）において、上記スレッド３（４４３）における上記アボートを検出した時点でトランザクション８についてアボート中である。コンピュータ（１０１）は、上記トランザクション８の終了直前において、当該トランザクション８の先行番号７を有するトランザクション７（スレッド３（４４３））がまだ終了していないので、上記トランザクション８それ自身がコミットされるべき順番にないと判断し、そして、上記トランザクション８がコミットされるべき順番にないことに応じて、当該トランザクション８をアボートする。コンピュータ（１０１）は、当該アボートを検出したことに応じて、全てのスレッドをバリア同期する為のバリア同期フラグを立てて、又は上記バリア同期フラグがすでに立っているのでバリア同期フラグを立てたと見なし、上記トランザクション８を再実行（「再実行８」と表記する）する。コンピュータ（１０１）は、当該再実行８が終了したこと（すなわち、再実行８がコミットされたこと）に応じて、上記バリア同期フラグが立っており、且つ、上記スレッド１（４４１）を除く全てのスレッド（スレッド２（４４２）及びスレッド３（４４３））中のトランザクション（再実行７及び再実行８）が全てコミットされていることから、バリア同期フラグを下げて、バリア同期（４５２）を終了する。
【０１４２】
コンピュータ（１０１）は、スレッド１（４４１）において、上記スレッド３（４４３）における上記アボートを検出した時点でトランザクション９を実行中である。コンピュータ（１０１）は、上記トランザクション９の終了直前において、当該トランザクション９の先行番号８を有する再実行８（スレッド２（４４２））がまだ終了していないので、上記トランザクション９それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション９がコミットされるべき順番にないことに応じて、当該トランザクション９をアボートする。コンピュータ（１０１）は、上記バリア同期フラグがすでに立っているが、スレッド１（４４１）はバリア同期（４５２）の対象でないことから、引き続き再実行９を実行する。コンピュータ（１０１）は、上記再実行９の終了直前において、当該再実行９の先行番号８を有する再実行８（スレッド２（４４２））が終了しているので、上記再実行９それ自身がコミットされるべき順番にあると判断し、当該再実行９をコミットする。
【０１４３】
コンピュータ（１０１）は、上記バリア同期（４５２）が終了したことに応じて、上記スレッド１（４４１）を除く全てのスレッド（スレッド２（４４２）及びスレッド３（４４３））において、トランザクションの処理を再開する。すなわち、コンピュータ（１０１）は、アボートを検出すること及びバリア同期をすることの処理を繰り返す。
【０１４４】
上記実施例６において、上記アボート率が所定の閾値よりも低いことに応じて、上記スレッド３（４４３）における上記トランザクション７についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅いスレッド１（４４１）を除く全てのスレッド（スレッド２（４４２）及びスレッド３（４４３））中のトランザクションが全てアボートされるまで、上記スレッド１（４４１）を除く全てのスレッド（スレッド２（４４２）及びスレッド３（４４３））をバリア同期（４５２）することによって、当該アボートの連鎖が防止される。
【０１４５】
コンピュータ（１０１）は例えば、（１）上記スレッド３（４４３）における上記トランザクション７についてのアボートを検出することに応じて、（２）バリア同期（４５２）が終了することに応じて、（３）所定の時間間隔で、又は（４）所定量のトランザクションが処理されることに応じて、アボート率を計算しうる。当業者は、図２Ｂの説明において定義したアボート率を任意に選択しうる。
【０１４６】
コンピュータ（１０１）は、上記アボート率が所定の閾値よりも低いことに応じて、引き続き、スレッド１（４４１）を除く全てのスレッド（スレッド２（４４２）及びスレッド３（４４３））において、トランザクションの処理を再開する。すなわち、コンピュータ（１０１）は、アボートを検出すること及びバリア同期をすることの処理を繰り返す。上記アボート率が所定の閾値よりも低いかを判断する理由は、各トランザクションの実行時間のばらつきが大きい場合に、アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅いスレッドを除く全てのスレッド中のトランザクションが全てコミットされるまで全てのスレッドをバリア同期することで、却ってトランザクションの処理が遅くなりうる場合もあるからである。
【０１４７】
なお、図４Ｂにおいて、コンピュータ（１０１）が、スレッド２（４４１）においてトランザクション１０を実行し、次に、スレッド３（４４３）においてトランザクション１１を実行しているように示しているが、いずれかのスレッドがどのトランザクションを実行するかは任意であって、上記に限定されるものでないことに留意されたい。
【０１４８】
図５Ａは、本発明の実施態様に従う実施例７を示す。当該実施例７において、複数のスレッド中のトランザクションのうちの１つのトランザクションにおいてアボートが起きたことに応じて、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッド中のトランザクションが全てアボートされるまで、上記トランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッドがバリア同期される。
【０１４９】
図５Ａは、スレッド１〜スレッド３（５１１，５１２及び５１３）それぞれにおいて、各トランザクションが実行されていることを示す。各トランザクションは、実行時間のばらつきがそれほど大きくないもの（均一トランザクションともいう）とする。
【０１５０】
コンピュータ（１０１）は、スレッド３（５１３）において、トランザクション６の終了直前において、当該トランザクション６の先行番号５を有するトランザクション５（スレッド２（５１２））がまだ終了していないので、上記トランザクション６それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション６がコミットされるべき順番にないことに応じて、当該トランザクション６をアボートする。コンピュータ（１０１）は、上記アボートを検出したことに応じて、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅いスレッドを除く全てのスレッドがバリア同期（５２１）されるまで、スレッド３（５１３）において、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（下記トランザクション６、下記トランザクション７及び下記トランザクション８）の実行順が遅いスレッド２（トランザクション８を実行中である）（５１２）を除く全てのスレッド（スレッド１（５１１）及びスレッド３（５１３））が全てアボートされるまで、スレッド２（５１２）を除く全てのスレッド（スレッド１（５１１）及びスレッド３（５１３））をバリア同期（５２１）する。なお、当該実施例７において、バリア同期するかを判断するステップと実際にバリア同期するステップとが同じ（下記図９Ａのステップ９１１を参照）である為に、全てのスレッドをバリア同期する為のバリア同期フラグを必ずしも立てる必要は無い。
【０１５１】
コンピュータ（１０１）は、上記スレッド３（５１３）において上記トランザクション６についてのアボートが起きた後、当該アボートが起きたことを図５Ａに示す時点（アボート検出）で検出する。
【０１５２】
コンピュータ（１０１）は、スレッド１（５１１）において、上記スレッド３（５１３）における上記トランザクション６についてのアボートを検出した時点でトランザクション７を実行中である。コンピュータ（１０１）は、上記トランザクション７の終了直前において、当該トランザクション７の先行番号６を有するトランザクション６（スレッド３（５１３））がまだ終了していないので（バリア同期中）、上記トランザクション７それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション７がコミットされるべき順番にないことに応じて、当該トランザクション７をアボートする。
【０１５３】
コンピュータ（１０１）は、上記トランザクション７がアボートされることに応じて、上記スレッド３（５１３）における上記トランザクション６についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション６、トランザクション７及びトランザクション８）の実行順が遅いスレッド２（トランザクション８を実行中である）（５１２）を除く全てのスレッド（スレッド１（５１１）及びスレッド３（５１３））中のトランザクション（トランザクション６及びトランザクション７）が全てアボートされていることから、バリア同期（５２１）を終了する。
【０１５４】
コンピュータ（１０１）は、スレッド２（５１２）において、上記スレッド３（５１３）における上記アボートを検出した時点でトランザクション８を実行中である。コンピュータ（１０１）は、上記トランザクション８の終了直前において、当該トランザクション８の先行番号７を有するトランザクション７（スレッド１（５１１））がまだ終了していないので、上記トランザクション８それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション８がコミットされるべき順番にないことに応じて、当該トランザクション８をアボートする。コンピュータ（１０１）は、スレッド２（５１２）がバリア同期（５２１）の対象でないことから、引き続き再実行８を実行する。コンピュータ（１０１）は、上記再実行８の終了直前において、当該再実行８の先行番号７を有する再実行７（スレッド３（５１３））が終了しているので、上記再実行８それ自身がコミットされるべき順番にあると判断し、当該再実行８をコミットする。
【０１５５】
コンピュータ（１０１）は、上記バリア同期（５２１）が終了したことに応じて、スレッド２（５１２）を除く全てのスレッド（スレッド１（５１１）及びスレッド３（５１３））において、トランザクションの処理を再開する。すなわち、コンピュータ（１０１）は、アボートを検出すること及びバリア同期をすることの処理を繰り返す。
【０１５６】
なお、図５Ａにおいて、コンピュータ（１０１）が、スレッド１（５１１）においてトランザクション６を再実行（「再実行６」と表記する）し、次に、スレッド３（５１３）においてトランザクション７を再実行（「再実行７」と表記する）するように示しているが、どのスレッドがどのトランザクションを再実行するかは任意であって、上記に限定されるものでないことに留意されたい。
【０１５７】
上記実施例７において、上記スレッド３（５１３）における上記トランザクション６についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅いスレッド２（５１２）を除く全てのスレッド（スレッド１（５１１）及びスレッド３（５１３））中のトランザクションが全てアボートされるまで、スレッド２（５１２）を除く全てのスレッド（スレッド１（５１１）及びスレッド３（５１３））をバリア同期（５２１）することによって、当該アボートの連鎖が防止される。
【０１５８】
図５Ｂは、本発明の実施態様に従う実施例８を示す。当該実施例８において、各トランザクションの実行時間のばらつきが大きいプログラムの実行中にアボート率を計算し、複数のスレッド中のトランザクションのうちの１つのトランザクションにおいてアボートが起きたことに応じて、上記計測したアボート率が所定の閾値より低いことを条件に、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッド中のトランザクションが全てアボートされるまで、上記トランザクションの実行順が遅い１つ又は複数のスレッドを除く全てのスレッドがバリア同期される。
【０１５９】
図５Ｂは、スレッド１〜スレッド３（５４１，５４２及び５４３）それぞれにおいて、各トランザクションが実行されていることを示す。各トランザクションは、実行時間のばらつきが大きいもの（不均一トランザクションともいう）とする。
【０１６０】
コンピュータ（１０１）は、スレッド３（５４３）において、トランザクション３の終了直前において、当該トランザクション３の先行番号２を有するトランザクション２（スレッド２（５４２））がまだ終了していないので、上記トランザクション３それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション３がコミットされるべき順番にないことに応じて、当該トランザクション３をアボートする。コンピュータ（１０１）は、上記アボートを検出したことに応じて、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅いスレッドを除く全てのスレッドがバリア同期（５５１）されるまで、スレッド３（５４３）において、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション３、下記トランザクション４及び下記トランザクション５）の実行順が遅いスレッド２（トランザクション５を実行中である）（５４２）を除く全てのスレッド（スレッド１（５４１）及びスレッド３（５４３））が全てアボートされるまで、スレッド２（５４２）を除く全てのスレッド（スレッド１（５４１）及びスレッド３（５４３））をバリア同期（５５１）する。なお、当該実施例８において、バリア同期するかを判断するステップと実際にバリア同期するステップとが同じ（下記図９Ｂのステップ９３１を参照）である為に、全てのスレッドをバリア同期する為のバリア同期フラグを必ずしも立てる必要は無い。
【０１６１】
コンピュータ（１０１）は、上記スレッド３（５４３）において上記トランザクション３についてのアボートが起きた後、当該アボートが起きたことを図５Ｂに示す時点（アボート検出１）で検出する。
【０１６２】
コンピュータ（１０１）は、スレッド１（５４１）において、上記スレッド３（５４３）における上記トランザクション３についてのアボートを検出した時点でトランザクション４をアボート中である。コンピュータ（１０１）は、上記トランザクション４の終了直前において、当該トランザクション４の先行番号３を有するトランザクション３（スレッド３（５４３））がまだ終了していないので（アボート中）、上記トランザクション４それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション４がコミットされるべき順番にないことに応じて、当該トランザクション４をアボートする。
【０１６３】
コンピュータ（１０１）は、スレッド１（５４１）において、上記トランザクション４がアボートされることに応じて、上記スレッド３（５４３）における上記トランザクション３についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション２、トランザクション３及びトランザクション４）の実行順が遅いスレッド２（トランザクション５を実行中である）（５４２）を除く全てのスレッド（スレッド１（５４１）及びスレッド３（５４３））中のトランザクション（トランザクション３及びトランザクション４）が全てアボートされていることから、バリア同期（５５１）を終了する。
【０１６４】
コンピュータ（１０１）は、スレッド２（５４２）において、上記スレッド３（５４３）における上記アボートを検出した時点でトランザクション５を実行中である。コンピュータ（１０１）は、上記トランザクション５の終了直前において、当該トランザクション５の先行番号４を有するトランザクション４（スレッド１（５４１））がまだ終了していないので、上記トランザクション５それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション５がコミットされるべき順番にないことに応じて、当該トランザクション５をアボートする。コンピュータ（１０１）は、スレッド２（５４２）はバリア同期（５５１）の対象でないことから、引き続きトランザクション５を再実行（「再実行５」と表記する）する。コンピュータ（１０１）は、上記トランザクション５の終了直前において、当該トランザクション５の先行番号４を有する再実行４（スレッド３（５４３））が終了しているので、上記再実行５それ自身がコミットされるべき順番にあると判断し、当該再実行５をコミットする。
【０１６５】
上記実施例８において、上記スレッド３（５４３）における上記トランザクション３についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅いスレッド２（５４２）を除く全てのスレッド（スレッド１（５４１）及びスレッド３（５４３））中のトランザクションが全てアボートされるまで、スレッド２（５４２）を除く全てのスレッド（スレッド１（５４１）及びスレッド３（５４３））をバリア同期（５５１）することによって、当該アボートの連鎖が防止される。
【０１６６】
コンピュータ（１０１）は例えば、（１）上記スレッド３（５４３）における上記トランザクション３についてのアボートを検出することに応じて、（２）バリア同期（５５１）が終了することに応じて、（３）所定の時間間隔で、又は（４）所定量のトランザクションが処理されることに応じて、アボート率を計算しうる。当業者は、図２Ａの説明において定義したアボート率を任意に選択しうる。
【０１６７】
コンピュータ（１０１）は、上記アボート率が所定の閾値よりも低いことに応じて、引き続き、スレッド２（５４２）を除く全てのスレッド（スレッド１（５４１）及びスレッド３（５４３））において、トランザクションの処理を再開する。すなわち、コンピュータ（１０１）は、アボートを検出すること及びバリア同期をすることの処理を繰り返す。上記アボート率が所定の閾値よりも低いかを判断する理由は、各トランザクションの実行時間のばらつきが大きい場合に、アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てアボートされるまで全てのスレッドをバリア同期することで、却ってトランザクションの処理が遅くなりうる場合もあるからである。
【０１６８】
なお、図５Ｂにおいて、コンピュータ（１０１）が、スレッド１（５４１）においてトランザクション３を再実行（「再実行３」と表記する）し、次に、スレッド３（５４３）においてトランザクション４を再実行（「再実行４」と表記する）するように示しているが、どのスレッドがどのトランザクションを再実行するかは任意であって、上記に限定されるものでないことに留意されたい。
【０１６９】
引き続き、コンピュータ（１０１）は、スレッド３（５４３）において、トランザクション７の終了直前において、当該トランザクション７の先行番号６を有するトランザクション６（スレッド１（５４１））がまだ終了していないので、上記トランザクション７それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション７がコミットされるべき順番にないことに応じて、当該トランザクション７をアボートする。コンピュータ（１０１）は、上記アボートを検出したことに応じて、当該アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅いスレッドを除く全てのスレッドがバリア同期（５５２）されるまで、スレッド３（５４３）において、次のトランザクションの処理を行わずに待つ。すなわち、コンピュータ（１０１）は、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション７、下記トランザクション８及び下記トランザクション９）の実行順が遅いスレッド１（トランザクション９を実行中である）（５４１）を除く全てのスレッド（スレッド２（５４２）及びスレッド３（５４３））が全てアボートされるまで、スレッド１（５４１）を除く全てのスレッド（スレッド２（５４２）及びスレッド３（５４３））をバリア同期（５５２）する。
【０１７０】
コンピュータ（１０１）は、上記スレッド３（５４３）において上記トランザクション７についてのアボートが起きた後、当該アボートが起きたことを図５Ｂに示す時点（アボート検出２）で検出する。
【０１７１】
コンピュータ（１０１）は、スレッド２（５４２）において、上記スレッド３（５４３）における上記トランザクション７についてのアボートを検出した時点でトランザクション８をアボート中である。
【０１７２】
コンピュータ（１０１）は、スレッド２（５４２）において、上記トランザクション８のアボートが終了することに応じて、上記スレッド３（５４３）における上記トランザクション７についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクション（トランザクション７、トランザクション８及びトランザクション９）の実行順が遅いスレッド１（トランザクション９を実行中である）（５４１）を除く全てのスレッド（スレッド２（５４２）及びスレッド３（５４３））中のトランザクション（トランザクション７及びトランザクション８）が全てアボートされていることから、バリア同期（５５２）を終了する。
【０１７３】
コンピュータ（１０１）は、スレッド１（５４１）において、上記スレッド３（５４３）における上記アボートを検出した時点でトランザクション９を実行中である。コンピュータ（１０１）は、上記トランザクション９の終了直前において、当該トランザクション９の先行番号８を有するトランザクション８（スレッド３（５４３））がまだ終了していないので、上記トランザクション９それ自身がコミットされるべき順番にないと判断する。コンピュータ（１０１）は、上記トランザクション９がコミットされるべき順番にないことに応じて、当該トランザクション９をアボートする。コンピュータ（１０１）は、スレッド１（５４１）はバリア同期（５５２）の対象でないことから、引き続きトランザクション９を再実行（「再実行９」と表記する）する。コンピュータ（１０１）は、上記再実行９の終了直前において、当該再実行９の先行番号８を有する再実行８（スレッド３（５４３））が終了しているので、上記再実行９それ自身がコミットされるべき順番にあると判断し、当該再実行９をコミットする。
【０１７４】
上記実施例８において、上記スレッド３（５４３）における上記トランザクション７についてのアボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅いスレッド１（５４１）を除く全てのスレッド（スレッド２（５４２）及びスレッド３（５４３））中のトランザクションが全てアボートされるまで、上記スレッド１（５４１）を除く全てのスレッド（スレッド２（５４２）及びスレッド３（５４３））をバリア同期（５５２）することによって、当該アボートの連鎖が防止される。
【０１７５】
コンピュータ（１０１）は例えば、（１）上記スレッド３（５４３）における上記トランザクション７についてのアボートを検出することに応じて、（２）バリア同期（５５２）が終了することに応じて、（３）所定の時間間隔で、又は（４）所定量のトランザクションが処理されることに応じて、アボート率を計算しうる。当業者は、図２Ｂの説明において定義したアボート率を任意に選択しうる。
【０１７６】
コンピュータ（１０１）は、上記アボート率が所定の閾値よりも低いことに応じて、引き続き、スレッド１（５４１）を除く全てのスレッド（スレッド２（５４２）及びスレッド３（５４３））において、トランザクションの処理を再開する。すなわち、コンピュータ（１０１）は、アボートを検出すること及びバリア同期をすることの処理を繰り返す。上記アボート率が所定の閾値よりも低いかを判断する理由は、各トランザクションの実行時間のばらつきが大きい場合に、アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行順が遅いスレッドを除く全てのスレッド中のトランザクションが全てアボートされるまで全てのスレッドをバリア同期することで、却ってトランザクションの処理が遅くなりうる場合もあるからである。
【０１７７】
なお、図５Ｂにおいて、コンピュータ（１０１）が、スレッド２（５４２）においてトランザクション７を再実行（「再実行７」と表記する）し、次に、スレッド３（５４３）においてトランザクション８を再実行（「再実行８」と表記する）するように示しているが、どのスレッドがどのトランザクションを再実行するかは任意であって、上記に限定されるものでないことに留意されたい。
【０１７８】
下記図６Ａ〜図６Ｂ、図７Ａ〜図７Ｂ、図８Ａ〜図８Ｂ及び図９Ａ〜図９Ｂそれぞれは、上記実施例１〜２（図２Ａ〜図２Ｂ）、上記実施例３〜４（図３Ａ〜図３Ｂ）、上記実施例５〜６（図４Ａ〜図４Ｂ）及び上記実施例７〜８（図５Ａ〜図５Ｂ）それぞれに示す実施態様を実行する為のフローチャートを示す。
【０１７９】
図６Ａは、本発明の実施態様に従う上記実施例１に示す実施態様を実行する為のフローチャートを示す。コンピュータ（１０１）は、複数のスレッドの各スレッド（以下、ある１つの特定のスレッドを「対象スレッド」という）において、下記ステップ６０１〜６１６の各処理を実行する。ステップ６０６、６０７、６０９、６１０、６１１及び６１５はそれぞれ、図１５に示すステップ１５０２、１５０３、１５０４、１５０５、１５０６及び１５０７に対応する。従って、ステップ６０３〜６０５及びステップ６１４が、上記実施例１に示す実施態様を実行する為に、従来技術である単純実装による方法の処理に対して追加されたステップである。
【０１８０】
ステップ６０１において、コンピュータ（１０１）は、上記対象スレッドにおいて、上記実施例１に示す実施態様を実行する為の方法を開始する。
【０１８１】
ステップ６０３において、コンピュータ（１０１）は、全てのスレッドをバリア同期する為のバリア同期フラグが立っているかを判断する。バリア同期フラグは、全てのスレッドに対して共通に１つ設けられる。コンピュータ（１０１）は、上記バリア同期フラグが立っていることに応じて、処理をステップ６０４に進める。一方、コンピュータ（１０１）は、上記バリア同期フラグが立っていないことに応じて、処理をステップ６０６に進める。
【０１８２】
ステップ６０４において、コンピュータ（１０１）は、上記バリア同期フラグが立っていることに応じて、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てコミットされるまで、全てのスレッドをバリア同期する。すなわち、コンピュータ（１０１）は、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てコミットされるまで、次のトランザクションの処理を行わない（全てのスレッドがバリア同期するまで待つ）。コンピュータ（１０１）は、全てのスレッドがバリア同期したことに応じて、処理をステップ６０５に進める。
【０１８３】
ステップ６０５において、コンピュータ（１０１）は、全てのスレッドがバリア同期されることに応じて、上記バリア同期フラグを下げる。引き続き、コンピュータ（１０１）は、処理をステップ６０６に進める。
【０１８４】
ステップ６０６において、コンピュータ（１０１）は、全てのトランザクションを実行したかを判断する。コンピュータ（１０１）は、全てのトランザクションが実行されていないことに応じて、残りのトランザクションを実行する為に処理をステップ６０７に進める。一方、コンピュータ（１０１）は、全てのトランザクションが実行されていることに応じて、処理を終了ステップ６１６に進める。
【０１８５】
ステップ６０７において、コンピュータ（１０１）は、上記対象スレッドが次に実行すべきトランザクションの番号を取得する。
【０１８６】
ステップ６０９において、コンピュータ（１０１）は、上記対象スレッドにおいて、上記取得した番号のトランザクションの処理を開始する。
【０１８７】
ステップ６１０において、コンピュータ（１０１）は、上記対象スレッドにおいて、上記取得した番号のトランザクションを実行する。
【０１８８】
ステップ６１１において、コンピュータ（１０１）は、上記対象スレッドにおいて、上記トランザクションがアボートしたかを判断する。コンピュータ（１０１）は、当該トランザクションがアボートしたことに応じて、処理をステップ６１４に進める。一方、コンピュータ（１０１）は、当該トランザクションがアボートしていないことに応じて、処理をステップ６１５に進める。
【０１８９】
ステップ６１４において、コンピュータ（１０１）は、当該トランザクションがアボートしたことに応じて、バリア同期フラグを立てる。なお、コンピュータ（１０１）は、バリア同期フラグがすでに立っている場合には、バリア同期フラグを立てたと見なす。引き続き、コンピュータ（１０１）は、当該アボートされたトランザクションを再実行する為に、処理をステップ６０９に戻す。
【０１９０】
ステップ６１５において、コンピュータ（１０１）は、上記対象スレッドにおいて、当該トランザクションがアボートしていないことに応じて、当該トランザクションの処理を終了する（すなわち、コンピュータ（１０１）は、当該トランザクションをコミットする）。コンピュータ（１０１）は、当該トランザクションの処理の終了に応じて、処理をステップ６０３に戻す。
【０１９１】
ステップ６１６において、コンピュータ（１０１）は、全てのトランザクションの実行が終了していることに応じて、上記対象スレッドにおいて、上記実施例１に示す実施態様を実行する為の方法を終了する。
【０１９２】
図６Ｂは、本発明の実施態様に従う上記実施例２に示す実施態様を実行する為のフローチャートを示す。コンピュータ（１０１）は、複数のスレッドの各スレッド（対象スレッド）において、下記ステップ６２１〜６３６の各処理を実行する。ステップ６２６、６２７、６２９、６３０、６３１及び６３５はそれぞれ、図１５に示すステップ１５０２、１５０３、１５０４、１５０５、１５０６及び１５０７に対応する。従って、ステップ６２２〜６２５、６２８及びステップ６３２〜６３４が、上記実施例２に示す実施態様を実行する為に、従来技術である単純実装による方法の処理に対して追加されたステップである。また、ステップ６２３〜６２７、６２９〜６３１及び６３４〜６３５はそれぞれ図２Ａに示すステップ６０３〜６０７、６０９〜６１１及び６１４〜６１５に対応する。従って、ステップ６２２、６２８及び６３２〜６３３が、上記実施例２に示す実施態様を実行する為に、上記実施例１に示す実施態様に対して追加されたステップである。
【０１９３】
ステップ６２１において、コンピュータ（１０１）は、上記対象スレッドにおいて、上記実施例２に示す実施態様を実行する為の方法を開始する。
【０１９４】
ステップ６２２において、コンピュータ（１０１）は、全てのスレッドに対して共通に使用されるトランザクション数を計測するカウンタ（以下、「トランザクション数のカウンタ」という）、及びアボート数を計測するカウンタ（以下、「アボート数のカウンタ」という）をゼロに初期化する。
【０１９５】
ステップ６２３において、コンピュータ（１０１）は、全てのスレッドをバリア同期する為のバリア同期フラグが立っているかを判断する。バリア同期フラグは、全てのスレッドに対して１つ設けられる。コンピュータ（１０１）は、上記バリア同期フラグが立っていることに応じて、処理をステップ６２４に進める。一方、コンピュータ（１０１）は、上記バリア同期フラグが立っていないことに応じて、処理をステップ６２６に進める。
【０１９６】
ステップ６２４において、コンピュータ（１０１）は、上記バリア同期フラグが立っていることに応じて、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てコミットされるまで、全てのスレッドをバリア同期する。すなわち、コンピュータ（１０１）は、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てコミットされるまで、次のトランザクションの処理を行わない（全てのスレッドがバリア同期するまで待つ）。コンピュータ（１０１）は、全てのスレッドがバリア同期したことに応じて、処理をステップ６２５に進める。
【０１９７】
ステップ６２５において、コンピュータ（１０１）は、全てのスレッドがバリア同期されることに応じて、上記バリア同期フラグを下げる。引き続き、コンピュータ（１０１）は、処理をステップ６２６に進める。
【０１９８】
ステップ６２６において、コンピュータ（１０１）は、全てのトランザクションを実行したかを判断する。コンピュータ（１０１）は、全てのトランザクションが実行されていないことに応じて、残りのトランザクションを実行する為に処理をステップ６２７に進める。一方、コンピュータ（１０１）は、全てのトランザクションが実行されていることに応じて、処理を終了ステップ６３６に進める。
【０１９９】
ステップ６２７において、コンピュータ（１０１）は、上記対象スレッドが次に実行すべきトランザクションの番号を取得する。
【０２００】
ステップ６２８において、コンピュータ（１０１）は、次に実行すべきトランザクションの番号を取得することに応じて、トランザクション数のカウンタを１つインクリメントする。
【０２０１】
ステップ６２９において、コンピュータ（１０１）は、上記対象スレッドにおいて、上記取得した番号のトランザクションの処理を開始する。
【０２０２】
ステップ６３０において、コンピュータ（１０１）は、上記対象スレッドにおいて、上記取得した番号のトランザクションを実行する。
【０２０３】
ステップ６３１において、コンピュータ（１０１）は、上記対象スレッドにおいて、上記トランザクションがアボートしたかを判断する。コンピュータ（１０１）は、当該トランザクションがアボートしたことに応じて、処理をステップ６３２に進める。一方、コンピュータ（１０１）は、当該トランザクションがアボートしていないことに応じて、処理をステップ６３５に進める。
【０２０４】
ステップ６３２において、コンピュータ（１０１）は、上記トランザクションがアボートしていることに応じて、アボート数のカウンタを１つインクリメントする。
【０２０５】
ステップ６３３において、コンピュータ（１０１）は、アボート率が所定の閾値よりも低いかを判断する。当該閾値は例えば、上記実施例２に従う実施態様と従来技術である単純実装による方法とにおける速度向上を比較して、実験的にもめられうる値でありうる。コンピュータ（１０１）は、上記アボート率が所定の閾値よりも低いことに応じて、処理をステップ６３４に進める。一方、コンピュータ（１０１）は、アボート率が所定の閾値と同じかそれよりも高いことに応じて、処理をステップ６２９に戻す。
【０２０６】
ステップ６３４において、コンピュータ（１０１）は、上記アボート率が所定の閾値よりも低いことに応じて、バリア同期フラグを立てる。なお、コンピュータ（１０１）は、バリア同期フラグがすでに立っている場合であっても、バリア同期フラグを再度立てる処理をする。引き続き、コンピュータ（１０１）は、当該アボートされたトランザクションを再実行する為に、処理をステップ６２９に戻す。
【０２０７】
ステップ６３５において、コンピュータ（１０１）は、上記対象スレッドにおいて、当該トランザクションがアボートしていないことに応じて、当該トランザクションの処理を終了する（すなわち、コンピュータ（１０１）は、当該トランザクションをコミットする）。コンピュータ（１０１）は、当該トランザクションの処理の終了に応じて、処理をステップ６２３に戻す。
【０２０８】
ステップ６３６において、コンピュータ（１０１）は、全てのトランザクションの実行が終了していることに応じて、上記対象スレッドにおいて、上記実施例２に示す実施態様を実行する為の方法を終了する。
【０２０９】
図７Ａは、本発明の実施態様に従う上記実施例３に示す実施態様を実行する為のフローチャートを示す。コンピュータ（１０１）は、複数のスレッドの各スレッド（対象スレッド）において、下記ステップ７０１〜７１３の各処理を実行する。ステップ７０３、７０４、７０６、７０７、７０８及び７１２はそれぞれ、図１５に示すステップ１５０２、１５０３、１５０４、１５０５、１５０６及び１５０７に対応する。従って、ステップ７１１が、上記実施例３に示す実施態様を実行する為に、従来技術である単純実装による方法に対して追加されたステップである。
【０２１０】
ステップ７０１において、コンピュータ（１０１）は、上記対象スレッドにおいて、上記実施例３に示す実施態様を実行する為の方法を開始する。
【０２１１】
ステップ７０３において、コンピュータ（１０１）は、全てのトランザクションを実行したかを判断する。コンピュータ（１０１）は、全てのトランザクションが実行されていないことに応じて、残りのトランザクションを実行する為に処理をステップ７０４に進める。一方、コンピュータ（１０１）は、全てのトランザクションが実行されていることに応じて、処理を終了ステップ７１３に進める。
【０２１２】
ステップ７０４において、コンピュータ（１０１）は、上記対象スレッドが次に実行すべきトランザクションの番号を取得する。
【０２１３】
ステップ７０６において、コンピュータ（１０１）は、上記対象スレッドにおいて、上記取得した番号のトランザクションの処理を開始する。
【０２１４】
ステップ７０７において、コンピュータ（１０１）は、上記対象スレッドにおいて、上記取得した番号のトランザクションを実行する。
【０２１５】
ステップ７０８において、コンピュータ（１０１）は、上記対象スレッドにおいて、上記トランザクションがアボートしたかを判断する。コンピュータ（１０１）は、当該トランザクションがアボートしたことに応じて、処理をステップ７１１に進める。一方、コンピュータ（１０１）は、当該トランザクションがアボートしていないことに応じて、処理をステップ７１２に進める。
【０２１６】
ステップ７１１において、コンピュータ（１０１）は、当該トランザクションがアボートしたことに応じて、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てアボートされるまで、全てのスレッドをバリア同期する。すなわち、コンピュータ（１０１）は、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てアボートされるまで、次のトランザクションの処理を行わない（全てのスレッドがバリア同期するまで待つ）。コンピュータ（１０１）は、全てのスレッドがバリア同期したことに応じて、処理をステップ７０６に戻す。
【０２１７】
ステップ７１２において、コンピュータ（１０１）は、上記対象スレッドにおいて、当該トランザクションがアボートしていないことに応じて、当該トランザクションの処理を終了する（すなわち、コンピュータ（１０１）は、当該トランザクションをコミットする）。コンピュータ（１０１）は、当該トランザクションの処理の終了に応じて、処理をステップ７０３に戻す。
【０２１８】
ステップ７１３において、コンピュータ（１０１）は、全てのトランザクションの実行が終了していることに応じて、上記対象スレッドにおいて、上記実施例３に示す実施態様を実行する為の方法を終了する。
【０２１９】
図７Ｂは、本発明の実施態様に従う上記実施例４に示す実施態様を実行する為のフローチャートを示す。コンピュータ（１０１）は、複数のスレッドの各スレッド（対象スレッド）において、下記ステップ７２１〜７３３の各処理を実行する。ステップ７２３、７２４、７２６、７２７、７２８及び７３２はそれぞれ、図１５に示すステップ１５０２、１５０３、１５０４、１５０５、１５０６及び１５０７に対応する。従って、ステップ７２２、７２５、７２９〜７３１が、上記実施例４に示す実施態様を実行する為に、従来技術である単純実装による方法に対して追加されたステップである。また、ステップ７２３〜７２４、７２６〜７２８及び７３１〜７３２はそれぞれ図３Ａに示すステップ７０３〜７０４、７０６〜７０８及び７１１〜７１２に対応する。従って、ステップ７２２、７２５及び７２９〜７３０が、上記実施例４に示す実施態様を実行する為に、上記実施例３に示す実施態様に対して追加されたステップである。
【０２２０】
ステップ７２１において、コンピュータ（１０１）は、上記対象スレッドにおいて、上記実施例４に示す実施態様を実行する為の方法を開始する。
【０２２１】
ステップ７２２において、コンピュータ（１０１）は、全てのスレッドに対して共通に使用されるトランザクション数を計測するカウンタ（「トランザクション数のカウンタ）、及びアボート数を計測するカウンタ（アボート数のカウンタ）をゼロに初期化する。
【０２２２】
ステップ７２３において、コンピュータ（１０１）は、全てのトランザクションを実行したかを判断する。コンピュータ（１０１）は、全てのトランザクションが実行されていないことに応じて、残りのトランザクションを実行する為に処理をステップ７２４に進める。一方、コンピュータ（１０１）は、全てのトランザクションが実行されていることに応じて、処理を終了ステップ７３３に進める。
【０２２３】
ステップ７２４において、コンピュータ（１０１）は、上記対象スレッドが次に実行すべきトランザクションの番号を取得する。
【０２２４】
ステップ７２５において、コンピュータ（１０１）は、次に実行すべきトランザクションの番号を取得することに応じて、トランザクション数のカウンタを１つインクリメントする。
【０２２５】
ステップ７２６において、コンピュータ（１０１）は、上記対象スレッドにおいて、上記取得した番号のトランザクションの処理を開始する。
【０２２６】
ステップ７２７において、コンピュータ（１０１）は、上記対象スレッドにおいて、上記取得した番号のトランザクションを実行する。
【０２２７】
ステップ７２８において、コンピュータ（１０１）は、上記対象スレッドにおいて、上記トランザクションがアボートしたかを判断する。コンピュータ（１０１）は、当該トランザクションがアボートしたことに応じて、処理をステップ７２９に進める。一方、コンピュータ（１０１）は、当該トランザクションがアボートしていないことに応じて、処理をステップ７３２に進める。
【０２２８】
ステップ７２９において、コンピュータ（１０１）は、上記トランザクションがアボートしていることに応じて、アボート数のカウンタを１つインクリメントする。
【０２２９】
ステップ７３０において、コンピュータ（１０１）は、アボート率が所定の閾値よりも低いかを判断する。当該閾値は例えば、上記実施例４に従う実施態様と従来技術である単純実装による方法とにおける速度向上を比較して、実験的にもめられうる値でありうる。コンピュータ（１０１）は、上記アボート率が所定の閾値よりも低いことに応じて、処理をステップ７３１に進める。一方、コンピュータ（１０１）は、アボート率が所定の閾値と同じかそれよりも高いことに応じて、処理をステップ７２６に戻す。
【０２３０】
ステップ７３１において、コンピュータ（１０１）は、上記アボート率が所定の閾値よりも低いことに応じて、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てアボートされるまで、全てのスレッドをバリア同期する。すなわち、コンピュータ（１０１）は、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てアボートされるまで、次のトランザクションの処理を行わない（全てのスレッドがバリア同期するまで待つ）。コンピュータ（１０１）は、全てのスレッドがバリア同期したことに応じて、処理をステップ７２６に戻す。
【０２３１】
ステップ７３２において、コンピュータ（１０１）は、上記対象スレッドにおいて、当該トランザクションがアボートしていないことに応じて、当該トランザクションの処理を終了する（すなわち、コンピュータ（１０１）は、当該トランザクションをコミットする）。コンピュータ（１０１）は、当該トランザクションの処理の終了に応じて、処理をステップ７２３に戻す。
【０２３２】
ステップ７３３において、コンピュータ（１０１）は、全てのトランザクションの実行が終了していることに応じて、上記対象スレッドにおいて、上記実施例４に示す実施態様を実行する為の方法を終了する。
【０２３３】
図８Ａは、本発明の実施態様に従う上記実施例５に示す実施態様を実行する為のフローチャートを示す。コンピュータ（１０１）は、複数のスレッドの各スレッド（対象スレッド）において、下記ステップ８０１〜８１６の各処理を実行する。ステップ８０１〜８０３及び８０６〜８１６それぞれは、図６Ａに示すステップ６０１〜６０３及び６０６〜６１６それぞれに対応する。従って、ステップ８０１〜８０３及び８０６〜８１６それぞれの説明は、ステップ６０１〜６０３及び６０６〜６１６それぞれの説明を参照されたい。以下に、ステップ８０４及びステップ８０５について説明する。
【０２３４】
ステップ８０４において、コンピュータ（１０１）は、上記バリア同期フラグが立っていることに応じて、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行が遅い順にあるスレッドを除く全てのスレッド中のトランザクションが全てコミットされるまで、上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドをバリア同期する。すなわち、コンピュータ（１０１）は、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行が遅い順にあるスレッドを除く全てのスレッド中のトランザクションが全てコミットされるまで、上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドにおいて、次のトランザクションの処理を行わない（上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドがバリア同期するまで待つ）。コンピュータ（１０１）は、上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドがバリア同期したことに応じて、処理をステップ８０５に進める。
【０２３５】
ステップ８０５において、コンピュータ（１０１）は、上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドがバリア同期されることに応じて、上記バリア同期フラグを下げる。引き続き、コンピュータ（１０１）は、処理をステップ８０６に進める。
【０２３６】
図８Ｂは、本発明の実施態様に従う上記実施例６に示す実施態様を実行する為のフローチャートを示す。コンピュータ（１０１）は、複数のスレッドの各スレッド（対象スレッド）において、下記ステップ８２１〜８３６の各処理を実行する。ステップ８２１〜８２３及び８２６〜８３６それぞれは、図６Ｂに示すステップ６２１〜６２３及び６２６〜６３６それぞれに対応する。従って、ステップ８２１〜８２３及び８２６〜８３６それぞれの説明は、ステップ６２１〜６２３及び６２６〜６３６それぞれの説明を参照されたい。以下に、ステップ８２４及びステップ８２５について説明する。
【０２３７】
ステップ８２４において、コンピュータ（１０１）は、上記バリア同期フラグが立っていることに応じて、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行が遅い順にあるスレッドを除く全てのスレッド中のトランザクションが全てコミットされるまで、上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドをバリア同期する。すなわち、コンピュータ（１０１）は、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行が遅い順にあるスレッドを除く全てのスレッド中のトランザクションが全てコミットされるまで、上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドにおいて、次のトランザクションの処理を行わない（上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドがバリア同期するまで待つ）。コンピュータ（１０１）は、上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドにおいて、全てのスレッドがバリア同期したことに応じて、処理をステップ８２５に進める。
【０２３８】
ステップ８２５において、コンピュータ（１０１）は、上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドがバリア同期されることに応じて、上記バリア同期フラグを下げる。引き続き、コンピュータ（１０１）は、処理をステップ８２６に進める。
【０２３９】
図９Ａは、本発明の実施態様に従う上記実施例７に示す実施態様を実行する為のフローチャートを示す。コンピュータ（１０１）は、複数のスレッドの各スレッド（対象スレッド）において、下記ステップ９０１〜９１３の各処理を実行する。ステップ９０１〜９０８及び９１２〜９１３それぞれは、図７Ａに示すステップ７０１〜７０８及び７１２〜７１３それぞれに対応する。従って、ステップ９０１〜９０８及び９１２〜９１３それぞれの説明は、ステップ７０１〜７０８及び７１２〜７１３それぞれの説明を参照されたい。以下に、ステップ９１１について説明する。
【０２４０】
ステップ９１１において、コンピュータ（１０１）は、当該トランザクションがアボートしたことに応じて、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行が遅い順にあるスレッドを除く全てのスレッド中のトランザクションが全てアボートされるまで、上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドをバリア同期する。すなわち、コンピュータ（１０１）は、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行が遅い順にあるスレッドを除く全てのスレッド中のトランザクションが全てアボートされるまで、上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドにおいて、次のトランザクションの処理を行わない（上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドがバリア同期するまで待つ）。コンピュータ（１０１）は、上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドがバリア同期したことに応じて、処理をステップ９０６に戻す。
【０２４１】
図９Ｂは、本発明の実施態様に従う上記実施例８に示す実施態様を実行する為のフローチャートを示す。コンピュータ（１０１）は、複数のスレッドの各スレッド（対象スレッド）において、下記ステップ９２１〜９３３の各処理を実行する。ステップ９２１〜９３０及び９３２〜９３３それぞれは、図７Ｂに示すステップ７２１〜７３０及び７３２〜７３３それぞれに対応する。従って、ステップ９２１〜９３０及び９３２〜９３３それぞれの説明は、ステップ７２１〜７３０及び７３２〜７３３それぞれの説明を参照されたい。以下に、ステップ９３１について説明する。
【０２４２】
ステップ９３１において、コンピュータ（１０１）は、上記アボート率が所定の閾値よりも低いことに応じて、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行が遅い順にあるスレッドを除く全てのスレッド中のトランザクションが全てアボートされるまで、上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドをバリア同期する。すなわち、コンピュータ（１０１）は、上記アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションの実行が遅い順にあるスレッドを除く全てのスレッド中のトランザクションが全てアボートされるまで、上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドにおいて、次のトランザクションの処理を行わない（上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドがバリア同期するまで待つ）。コンピュータ（１０１）は、上記トランザクションの実行が遅い順にあるスレッドを除く全てのスレッドがバリア同期したことに応じて、処理をステップ９２６に戻す。
【０２４３】
図１０は、本発明の実施態様に従う上記実施例１及び上記実施例２それぞれにおけるベンチマーク結果を示す。
【０２４４】
ベンチマーク・プログラムとして、単一ループを全スレッドで合計20,000,000回繰り返し、ループの各トランザクションはローカル変数を指定回数加算する、本質的には完全に並列なプログラムを作成した。均一繰り返しベンチマークは、各トランザクションが1,000回ローカル変数を加算するものである。
【０２４５】
プログラムへの実装として、（１）従来技術である単純実装による手法、並びに、（２）実施例１による手法、及び（３）実施例２による手法を用いた。実施例２による手法では、実施例１による手法を用いつつ、アボート率を計測して、当該計測したアボート率が４０％以上の場合はバリア同期をしないように従来技術である単純実装に切り替えるように挙動を変えた。
【０２４６】
プログラムの実験環境は、16コア5.5 GHzのIBM zEC12上で実行した。
【０２４７】
グラフ（１００１は、均一繰り返しベンチマークの結果を示す。
【０２４８】
実施例１による手法では、単純実装による手法に対して３８％性能向上した。また、実施例１による手法では、最大性能は、シングルスレッド比で、２．１７倍対１．５７倍であった。
【０２４９】
実施例２による手法では、単純実装による手法に対して２５％性能向上した。また、実施例２による手法では、最大性能は、シングルスレッド比で、１．９７倍対１．５７倍であった。
【０２５０】
図１１Ａ及び図１１Ｂそれぞれは、本発明の実施態様を実装する為のアルゴリズムの例を示す。
【０２５１】
図１１Ａは、本発明の実施態様に従う上記実施例１を実装する為のアルゴリズム（１１０１）を示す。
【０２５２】
上記アルゴリズム（１１０１）において、行09〜12及び行24が、実施例１を実装する為に挿入されたコードである。当該アルゴリズム（１１０１）において、０１〜３４の数字（行番号）は、説明を容易にするために挿入されたものであって、実際のコードでは不要である。
【０２５３】
図１１Ｂは、本発明の実施態様に従う上記実施例２を実装する為のアルゴリズム（１１１１）を示す。
【０２５４】
上記アルゴリズム（１１１１）において、行07,行09〜12,行19中”transaction_count++;”, 行22〜23及び行24が、実施例２を実装するために挿入されたコードである。当該アルゴリズム（１１１１）において、０１〜３４の数字（行番号）は、説明を容易にするために挿入されたものであって、実際のコードでは不要である。
【０２５５】
図１２は、図１に従うハードウェア構成を好ましくは備えており、本発明の実施態様に従い複数のスレッドで順序付きトランザクションを実行するためのコンピュータ（１２０１）の機能ブロック図の一例を示した図である。
【０２５６】
コンピュータ（１２０１）は、本発明の実施態様に従い、複数のスレッドで順序付きトランザクションを実行するためのコンピュータであり、例えば図１に示すコンピュータ（１０１）である。
【０２５７】
コンピュータ（１２０１）は、プログラム実行手段（１２１１）、アボート検出手段（１２１２）、バリア同期手段（１２１３）、及びアボート率計測手段（１２１４）を備えている。
【０２５８】
プログラム実行手段（１２１１）は、複数のスレッドで順序付きトランザクションのプログラムを例えばプログラムを格納した記憶媒体（１２２１）から読み取り、当該読み取ったプログラムを実行する。
【０２５９】
プログラム実行手段（１２１１）は、図６Ａに示すステップ６０６〜６１０及び６１５、図６Ｂに示すステップ６２６〜６３０及び６３５、図７Ａに示すステップ７０３〜７０７及び７１２、図７Ｂに示すステップ７２３〜７２７及び７３２、図８Ａに示すステップ８０６〜８１０及び８１５、図８Ｂに示すステップ８２６〜８３０及び８３５、図９Ａに示すステップ９０３〜９０７及び９１２、並びに、図９Ｂに示すステップ９２３〜９２７及び９３２を実行しうる。
【０２６０】
アボート検出手段（１２１２）は、複数のスレッドそれぞれのトランザクションの少なくとも１つにおいてアボートが起きたことを検出する。
【０２６１】
アボート検出手段（１２１２）は、図６Ａに示すステップ６１１、図６Ｂに示すステップ６３１〜６３２、図７Ａに示すステップ７０８、図７Ｂに示すステップ７２８〜７２９、図８Ａに示すステップ８１１、図８Ｂに示すステップ８３１〜８３２、図９Ａに示すステップ９０８、及び、図９Ｂに示すステップ９２８〜９２９を実行しうる。
【０２６２】
バリア同期手段（１２１３）は、アボートが検出されたスレッドを含む少なくとも２つのスレッドをバリア同期する。
【０２６３】
また、バリア同期手段（１２１３）は、アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションが全てコミット又は全てアボートされるまで、全てのスレッドをバリア同期する。
【０２６４】
また、バリア同期手段（１２１３）は、アボートが検出された時点で処理中（実行中又はアボート中）のトランザクションのうちの実行順が遅い１つ又は複数のスレッドを除く全てのスレッド中のトランザクションが全てコミット又は全てアボートされるまで、全てのスレッドをバリア同期する。
【０２６５】
バリア同期手段（１２１３）は、図６Ａに示すステップ６０３〜６０５及び６１４、図６Ｂに示すステップ６２３〜６２５及び６３４、図７Ａに示すステップ７１１、図７Ｂに示すステップ７３１、図８Ａに示すステップ８０３〜８０５及び８１４、図８Ｂに示す８２３〜８２５及び８３４、図９Ａに示すステップ９１１、並びに、図９Ｂに示すステップ９３１を実行しうる。
【０２６６】
アボート率計測手段（１２１４）は、アボート率を例えば、（１）アボートを検出することに応じて、（２）バリア同期が終了することに応じて、（３）所定の時間間隔で、又は（４）所定量のトランザクションが処理されることに応じて、計測する。
【０２６７】
アボート率計測手段（１２１４）は、図６Ｂに示すステップ６３３、図７Ｂに示すステップ７３０、図８Ｂに示すステップ８３３、及び、図９Ｂに示すステップ９３０を実行しうる。
【図１】
0006021112.tif 000002
【図６Ａ】
0006021112.tif 000003
【図６Ｂ】
0006021112.tif 000004
【図７Ａ】
0006021112.tif 000005
【図７Ｂ】
0006021112.tif 000006
【図８Ａ】
0006021112.tif 000007
【図８Ｂ】
0006021112.tif 000008
【図９Ａ】
0006021112.tif 000009
【図９Ｂ】
0006021112.tif 000010
【図１１Ａ】
0006021112.tif 000011
【図１１Ｂ】
0006021112.tif 000012
【図１２】
0006021112.tif 000013
【図１３】
0006021112.tif 000014
【図１５】
0006021112.tif 000015
【図２Ａ】
0006021112.tif 000016
【図２Ｂ】
0006021112.tif 000017
【図３Ａ】
0006021112.tif 000018
【図３Ｂ】
0006021112.tif 000019
【図４Ａ】
0006021112.tif 000020
【図４Ｂ】
0006021112.tif 000021
【図５Ａ】
0006021112.tif 000022
【図５Ｂ】
0006021112.tif 000023
【図１０】
0006021112.tif 000024
【図１４】
0006021112.tif 000025