(57)【要約】【課題】スレッド間において、ＣＡＳ操作を利用せずに、矛盾なく情報の受け渡しをすることが可能でウェイトフリーなスレッド間通信方法、スレッド間通信システム、及びスレッド間通信プログラムを提供する。【解決手段】各スレッドには他のスレッドの数に相当する数だけパイプが用意されており、送信スレッドが新規ノード５１１をパイプの末尾に追加して格納する。また、取り出しスレッドが、パイプにおける先頭ノードのポインタ変数が無効値でない場合に当該ポインタ変数が指す場所のノード７１２からレコードを取り出す。一方、当該ポインタ変数は無効値である場合に、取り出し可能なレコードは無い状態であると判断される。このように、各スレッドには他のスレッドの数に相当する数だけパイプが用意された上で、送信スレッドによるパイプへのノードの格納と、取り出しスレッドによるパイプからのレコードの取り出しとが行われる。【選択図】図３
2014222457.tif 000002
【特許請求の範囲】
【請求項１】
レコードを格納可能なノードの場所を指すポインタ情報が格納されるポインタ変数からの当該ポインタ情報の読み込み処理と、当該ポインタ変数へのポインタ情報の書き込み処理とが、不可分に可能な環境において、複数のスレッドが互いにレコードを送受信するためのスレッド間通信方法であって、
各スレッドには、他のスレッドの数に相当する数だけ送受信リンクリストが用意されており、各送受信リンクリストは、互いに異なる他のスレッドの一つと対応付けられ、当該対応付けられたスレッドから送信されたレコードを格納順を指定してノードに格納することが可能であり、
レコードの送信元である送信スレッドが、当該レコードを格納した新規ノードを生成して、当該レコードの送信先である受信スレッドと対応する送受信リンクリストに追加する場合に、当該新規ノードのポインタ変数に第一所定値を設定しつつ当該新規ノードを当該送受信リンクリストの末尾に追加して格納する受信追加ステップと、
送受信リンクリストからレコードを取り出す取り出しスレッドが、当該レコードを対応する送受信リンクリストから取り出す場合に、当該送受信リンクリストの先頭ノードのポインタ変数が前記第一所定値であるか否かを判定する受信判定ステップと、
前記受信判定ステップにおいて当該ポインタ変数は前記第一所定値でないと判定された場合に、前記取り出しスレッドが、当該ポインタ変数が指す場所のノードからレコードを取り出しつつ当該ノードを新たな先頭ノードとして設定する処理を行う受信取出ステップと、
前記受信判定ステップにおいて当該ポインタ変数は前記第一所定値であると判定された場合に、前記取り出しスレッドが、対応する送受信リンクリストから取り出し可能なレコードを格納するノードは無い状態であると判断する状態判断ステップと、
を含むスレッド間通信方法。
【請求項２】
各スレッドが、レコードの入力を受け付けると、入力されたレコードを処理すべきスレッドを決定する決定ステップと、
前記入力されたレコードは自スレッドで処理すべきと決定された場合に、各スレッドが、当該入力されたレコードを自スレッドで処理する自己処理ステップと、
前記入力されたレコードは他のスレッドで処理すべきと決定された場合に、各スレッドが、当該入力されたレコードを他のスレッドに送信する送信ステップと、
を更に含む請求項１に記載のスレッド間通信方法。
【請求項３】
各スレッドには、他のスレッドの数に相当する数だけ保管リンクリストが用意されており、各保管リンクリストは、互いに異なる他のスレッドの一つと対応付けられ、レコードが取り出された使用済みノードを格納することが可能であり、
前記取り出しスレッドが、前記受信取出ステップにおいてレコードが取り出された使用済みノードのポインタ変数に、第二所定値を設定しつつ、当該使用済みノードを前記保管リンクリストの末尾に追加して格納する取出格納ステップと、
レコードの送信元である送信スレッドが、当該レコードの送信先である受信スレッドと対応する保管リンクリストの先頭ノードのポインタ変数が前記第二所定値であるか否かを判定する取出判定ステップと、
前記取出判定ステップにおいて当該先頭ノードのポインタ変数は前記第二所定値でないと判定された場合に、前記送信スレッドが、当該先頭ノードを前記新規ノードとして再利用しつつ当該先頭ノードのポインタ変数が指す場所のノードを新たな先頭ノードとして設定する処理を行う先頭取出ステップと、
前記取出判定ステップにおいて当該ポインタ変数は前記第二所定値であると判定された場合に、前記送信スレッドが、前記新規ノードを生成する取出生成ステップと、
を更に含む請求項１又は２に記載のスレッド間通信方法。
【請求項４】
前記取出格納ステップでは、前記取り出しスレッドが、前記受信取出ステップにおいてレコードが取り出された前記使用済みノードのポインタ変数に、前記第二所定値を設定しつつ、当該使用済みノードを末尾に追加する前記保管リンクリストを複数の保管リンクリストの中からラウンドロビンで選択し、当該選択された保管リンクリストの末尾に当該使用済みノードを追加する、請求項３に記載のスレッド間通信方法。
【請求項５】
レコードを格納可能なノードの場所を指すポインタ情報が格納されるポインタ変数からの当該ポインタ情報の読み込み処理と、当該ポインタ変数へのポインタ情報の書き込み処理とが、不可分に可能な環境において、複数のスレッドが互いにレコードを送受信可能なように当該複数のスレッドを制御するスレッド間通信システムであって、
各スレッドには、他のスレッドの数に相当する数だけ送受信リンクリストが用意されており、各送受信リンクリストは、互いに異なる他のスレッドの一つと対応付けられ、当該対応付けられたスレッドから送信されたレコードを格納順を指定してノードに格納することが可能であり、
レコードの送信元である送信スレッドが、当該レコードを格納した新規ノードを生成して、当該レコードの送信先である受信スレッドと対応する送受信リンクリストに追加する場合に、当該新規ノードのポインタ変数に第一所定値を設定しつつ当該新規ノードを当該送受信リンクリストの末尾に追加して格納するように各スレッドを制御する受信追加手段と、
送受信リンクリストからレコードを取り出す取り出しスレッドが、当該レコードを対応する送受信リンクリストから取り出す場合に、当該送受信リンクリストの先頭ノードのポインタ変数が前記第一所定値であるか否かを判定するように各スレッドを制御する受信判定手段と、
前記受信判定手段によって当該ポインタ変数は前記第一所定値でないと判定された場合に、前記取り出しスレッドが、当該ポインタ変数が指す場所のノードからレコードを取り出しつつ当該ノードを新たな先頭ノードとして設定する処理を行うように各スレッドを制御する受信取出手段と、
前記受信判定手段によって当該ポインタ変数は前記第一所定値であると判定された場合に、前記取り出しスレッドが、対応する送受信リンクリストから取り出し可能なレコードを格納するノードは無い状態であると判断するように各スレッドを制御する状態判断手段と、
を備えるスレッド間通信システム。
【請求項６】
レコードを格納可能なノードの場所を指すポインタ情報が格納されるポインタ変数からの当該ポインタ情報の読み込み処理と、当該ポインタ変数へのポインタ情報の書き込み処理とが、不可分に可能な環境において、複数のスレッドが互いにレコードを送受信可能なように当該複数のスレッドを制御するスレッド間通信システムとしての機能を、コンピュータに実現させるスレッド間通信プログラムであって、
各スレッドには、他のスレッドの数に相当する数だけ送受信リンクリストが用意されており、各送受信リンクリストは、互いに異なる他のスレッドの一つと対応付けられ、当該対応付けられたスレッドから送信されたレコードを格納順を指定してノードに格納することが可能であり、
前記コンピュータに、
レコードの送信元である送信スレッドが、当該レコードを格納した新規ノードを生成して、当該レコードの送信先である受信スレッドと対応する送受信リンクリストに追加する場合に、当該新規ノードのポインタ変数に第一所定値を設定しつつ当該新規ノードを当該送受信リンクリストの末尾に追加して格納するように各スレッドを制御する受信追加手段の機能と、
送受信リンクリストからレコードを取り出す取り出しスレッドが、当該レコードを対応する送受信リンクリストから取り出す場合に、当該送受信リンクリストの先頭ノードのポインタ変数が前記第一所定値であるか否かを判定するように各スレッドを制御する受信判定手段の機能と、
前記受信判定手段の機能によって当該ポインタ変数は前記第一所定値でないと判定された場合に、前記取り出しスレッドが、当該ポインタ変数が指す場所のノードからレコードを取り出しつつ当該ノードを新たな先頭ノードとして設定する処理を行うように各スレッドを制御する受信取出手段の機能と、
前記受信判定手段の機能によって当該ポインタ変数は前記第一所定値であると判定された場合に、前記取り出しスレッドが、対応する送受信リンクリストから取り出し可能なレコードを格納するノードは無い状態であると判断するように各スレッドを制御する状態判断手段の機能と、
を実現させるスレッド間通信プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、スレッド間通信方法、スレッド間通信システム、及びスレッド間通信プログラムに関する。
【背景技術】
【０００２】
スレッド間で情報の受け渡しを行う典型的な通信方法は、スレッド間で変数を共有し、当該変数の読み書き時に排他ロック機構によるロックを取得することにより、当該変数を介して矛盾なく情報の受け渡しを行うというものである。しかしながら、この方法には、当該変数の読み書きが行われる毎にその都度ロックを取得する必要があることから、処理効率が低下するおそれがあるという問題がある。また、この方法には、場合によってはデッドロックが発生しプログラム動作が破綻してしまうおそれがあるといった問題がある。
【０００３】
この排他ロック機構において起き得る問題を解決するために、ロックフリーな方法（排他ロック機構によるロックを用いない方法）により、スレッド間で情報の受け渡しを行う技術が考えられてきた。例えば非特許文献１には、ハッシュテーブル上において管理対象データの登録情報及び参照カウンタを併せ持ちつつ、これらを一体操作することによって、高並列データ処理に特有の複雑な競合タイミングを部品内部に局所化して隠蔽する技術が記載されている。
【０００４】
非特許文献１に記載の技術では、排他ロック機構の代わりに、ＣＡＳ（CompareAnd Swap）操作（又はそれに準じる操作）が用いられる。ＣＡＳ操作とは、メモリの位置が指す指定値と保持値とを比較し、一致していれば指示値を更新し、一方、不一致であれば再度、比較処理を行う操作のことであり、複数のスレッドがＣＡＳ操作を行って競合した場合、ただ一つのスレッドだけがＣＡＳ操作に成功し、他のスレッドは失敗するものである。非特許文献１に記載の技術では、ＣＡＳ操作に成功したスレッドがデータ構造への読み書き処理を行い、ＣＡＳ操作に失敗した他のスレッドは成功するまで繰り返しＣＡＳ操作を試みる。このように、ＣＡＳ操作ではロックの取得が行われないため、デッドロックが発生しプログラム動作が破綻してしまうおそれがあるという問題が解決されている。
【先行技術文献】
【非特許文献】
【０００５】
【非特許文献１】新田淳、外１名、「インメモリDBへの適用に向けた実用的で安全な高並列オープンアドレスハッシュテーブル」、情報処理学会論文誌、一般社団法人情報処理学会、平成２４年９月２８日、データベース５（３）、ｐ．１２６−１４０
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、上述したように、ＣＡＳ操作を利用する方法には二つの問題が残されている。一つの問題は、ＣＡＳ操作に失敗したスレッドは、成功するまで繰り返しＣＡＳ操作を試みるため、ウェイトフリー（Wait-free：予め定められた時間又はステップ数でＣＡＳ操作が終了すること）とならず、（競合が激しい状況下では）ＣＡＳ操作が終了しないことから、プログラムの処理効率が低下してしまうという問題である。スレッド間の競合は、スレッド数が多くなるほど起こりやすい。実際に、スレッド間の競合が激しい状況においては、スレッド数が多くなるほど、単一スレッドに対して性能はむしろ低下することを示す文献も存在する。昨今は、ＣＰＵのマルチコア化が進み、今後ますます、より多くのスレッドを用いたプログラムが開発されると予想されるため、この問題は重大である。
【０００７】
もう一つの問題は、ＣＡＳ操作自体が、全ての計算機、演算端末、及び／又はプログラミング言語において利用可能とは限らないことである。すなわち、ＣＡＳ操作を利用する方法は、利用可能な環境を限定してしまうということである。
【０００８】
そこで本発明は、上述の問題点を解消する為になされたものであり、スレッド間において、ＣＡＳ操作を利用せずに、矛盾なく情報の受け渡しをすることが可能でウェイトフリーなスレッド間通信方法、スレッド間通信システム、及びスレッド間通信プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明の一形態に係るスレッド間通信方法は、レコードを格納可能なノードの場所を指すポインタ情報が格納されるポインタ変数からの当該ポインタ情報の読み込み処理と、当該ポインタ変数へのポインタ情報の書き込み処理とが、不可分に可能な環境において、複数のスレッドが互いにレコードを送受信するためのスレッド間通信方法であって、各スレッドには、他のスレッドの数に相当する数だけ送受信リンクリストが用意されており、各送受信リンクリストは、互いに異なる他のスレッドの一つと対応付けられ、当該対応付けられたスレッドから送信されたレコードを格納順を指定してノードに格納することが可能であり、レコードの送信元である送信スレッドが、当該レコードを格納した新規ノードを生成して、当該レコードの送信先である受信スレッドと対応する送受信リンクリストに追加する場合に、当該新規ノードのポインタ変数に第一所定値を設定しつつ当該新規ノードを当該送受信リンクリストの末尾に追加して格納する受信追加ステップと、送受信リンクリストからレコードを取り出す取り出しスレッドが、当該レコードを対応する送受信リンクリストから取り出す場合に、当該送受信リンクリストの先頭ノードのポインタ変数が第一所定値であるか否かを判定する受信判定ステップと、受信判定ステップにおいて当該ポインタ変数は第一所定値でないと判定された場合に、取り出しスレッドが、当該ポインタ変数が指す場所のノードからレコードを取り出しつつ当該ノードを新たな先頭ノードとして設定する処理を行う受信取出ステップと、受信判定ステップにおいて当該ポインタ変数は第一所定値であると判定された場合に、取り出しスレッドが、対応する送受信リンクリストから取り出し可能なレコードを格納するノードは無い状態であると判断する状態判断ステップと、を含むことを特徴とする。
【００１０】
本発明の一形態に係るスレッド間通信方法では、各スレッドには、他のスレッドの数に相当する数だけ送受信リンクリストが用意されており、各送受信リンクリストは、互いに異なる他のスレッドの一つと対応付けられ、当該対応付けられたスレッドから送信されたレコードを格納順を指定してノードに格納することが可能である。そして、このスレッド間通信方法によれば、レコードの送信元である送信スレッドが、当該レコードを格納した新規ノードを生成して、当該レコードの送信先である受信スレッドと対応する送受信リンクリストに追加する場合に、当該新規ノードのポインタ変数に第一所定値を設定しつつ当該新規ノードを当該送受信リンクリストの末尾に追加して格納する。次に、取り出しスレッドが、当該レコードを対応する送受信リンクリストから取り出す場合に、当該送受信リンクリストの先頭ノードのポインタ変数が第一所定値であるか否かを判定する。そして、当該ポインタ変数は第一所定値でないと判定された場合に、取り出しスレッドが、当該ポインタ変数が指す場所のノードからレコードを取り出しつつ当該ノードを新たな先頭ノードとして設定する。一方、当該ポインタ変数は第一所定値であると判定された場合に、取り出しスレッドが、対応する送受信リンクリストから取り出し可能なレコードを格納するノードは無い状態であると判断する。
【００１１】
これにより、各スレッドには他のスレッドの数に相当する数だけ送受信リンクリストが用意されており、送信スレッドが新規ノードを生成して送信先の送受信リンクリストの末尾に追加して格納する。また、取り出しスレッドが、上記ポインタ変数が第一所定値でない場合に当該ポインタ変数が指す場所のノードからレコードを取り出す。一方、当該ポインタ変数は第一所定値である場合に、取り出し可能なレコードは無い状態であると判断される。このように、各スレッドには他のスレッドの数に相当する数だけ送受信リンクリストが用意された上で、送信スレッドによる送受信リンクリストへのノードの格納と、取り出しスレッドによる送受信リンクリストからのレコードの取り出しとが行われるため、ＣＡＳ操作を利用せずに、矛盾なく情報の受け渡しをすることが可能になり且つウェイトフリーになる。
【００１２】
別の形態に係るスレッド間通信方法では、各スレッドが、レコードの入力を受け付けると、入力されたレコードを処理すべきスレッドを決定する決定ステップと、入力されたレコードは自スレッドで処理すべきと決定された場合に、各スレッドが、当該入力されたレコードを自スレッドで処理する自己処理ステップと、入力されたレコードは他のスレッドで処理すべきと決定された場合に、各スレッドが、当該入力されたレコードを他のスレッドに送信する送信ステップと、を更に含んでもよい。
【００１３】
この形態では、各スレッドがレコードの入力を受け付けると、レコードを処理すべきスレッドが決定され、入力されたレコードは自スレッドで処理すべきと決定された場合に、各スレッドが自スレッドで処理する。一方、入力されたレコードは他のスレッドで処理すべきと決定された場合に、各スレッドが入力されたレコードを他のスレッドに送信する。
【００１４】
別の形態に係るスレッド間通信方法では、各スレッドには、他のスレッドの数に相当する数だけ保管リンクリストが用意されており、各保管リンクリストは、互いに異なる他のスレッドの一つと対応付けられ、レコードが取り出された使用済みノードを格納することが可能であり、取り出しスレッドが、受信取出ステップにおいてレコードが取り出された使用済みノードのポインタ変数に、第二所定値を設定しつつ、当該使用済みノードを保管リンクリストの末尾に追加して格納する取出格納ステップと、レコードの送信元である送信スレッドが、当該レコードの送信先である受信スレッドと対応する保管リンクリストの先頭ノードのポインタ変数が第二所定値であるか否かを判定する取出判定ステップと、取出判定ステップにおいて当該先頭ノードのポインタ変数は第二所定値でないと判定された場合に、送信スレッドが、当該先頭ノードを新規ノードとして再利用しつつ当該先頭ノードのポインタ変数が指す場所のノードを新たな先頭ノードとして設定する処理を行う先頭取出ステップと、取出判定ステップにおいて当該ポインタ変数は第二所定値であると判定された場合に、送信スレッドが、新規ノードを生成する取出生成ステップと、を更に含んでもよい。
【００１５】
この形態では、各スレッドには、他のスレッドの数に相当する数だけ保管リンクリストが用意されており、各保管リンクリストは、互いに異なる他のスレッドの一つと対応付けられ、レコードが取り出された使用済みノードを格納することが可能である。そして、この形態によれば、取り出しスレッドが、レコードが取り出された使用済みノードのポインタ変数に第二所定値を設定しつつ、当該使用済みノードを保管リンクリストの末尾に追加して格納する。次に、レコードの送信元である送信スレッドが、当該レコードの送信先である受信スレッドと対応する保管リンクリストの先頭ノードのポインタ変数が第二所定値であるか否かを判定する。そして、当該先頭ノードのポインタ変数は第二所定値でないと判定された場合に、送信スレッドが、当該先頭ノードを新規ノードとして再利用しつつ当該先頭ノードのポインタ変数が指す場所のノードを新たな先頭ノードとして設定する。一方、当該ポインタ変数は第二所定値であると判定された場合に、送信スレッドが、新規ノードを生成する。
【００１６】
別の形態に係るスレッド間通信方法では、取出格納ステップでは、取り出しスレッドが、受信取出ステップにおいてレコードが取り出された使用済みノードのポインタ変数に、第二所定値を設定しつつ、当該使用済みノードを末尾に追加する保管リンクリストを複数の保管リンクリストの中からラウンドロビンで選択し、当該選択された保管リンクリストの末尾に当該使用済みノードを追加してもよい。
【００１７】
この形態では、取り出された使用済みノードのポインタ変数に第二所定値が設定されつつ、当該使用済みノードを末尾に追加する保管リンクリストが複数の保管リンクリストの中からラウンドロビンで選択され、当該選択された保管リンクリストの末尾に当該使用済みノードが追加される。
【００１８】
本発明の一形態に係るスレッド間通信システムは、レコードを格納可能なノードの場所を指すポインタ情報が格納されるポインタ変数からの当該ポインタ情報の読み込み処理と、当該ポインタ変数へのポインタ情報の書き込み処理とが、不可分に可能な環境において、複数のスレッドが互いにレコードを送受信可能なように当該複数のスレッドを制御するスレッド間通信システムであって、各スレッドには、他のスレッドの数に相当する数だけ送受信リンクリストが用意されており、各送受信リンクリストは、互いに異なる他のスレッドの一つと対応付けられ、当該対応付けられたスレッドから送信されたレコードを格納順を指定してノードに格納することが可能であり、レコードの送信元である送信スレッドが、当該レコードを格納した新規ノードを生成して、当該レコードの送信先である受信スレッドと対応する送受信リンクリストに追加する場合に、当該新規ノードのポインタ変数に第一所定値を設定しつつ当該新規ノードを当該送受信リンクリストの末尾に追加して格納するように各スレッドを制御する受信追加手段と、送受信リンクリストからレコードを取り出す取り出しスレッドが、当該レコードを対応する送受信リンクリストから取り出す場合に、当該送受信リンクリストの先頭ノードのポインタ変数が第一所定値であるか否かを判定するように各スレッドを制御する受信判定手段と、受信判定手段によって当該ポインタ変数は第一所定値でないと判定された場合に、取り出しスレッドが、当該ポインタ変数が指す場所のノードからレコードを取り出しつつ当該ノードを新たな先頭ノードとして設定する処理を行うように各スレッドを制御する受信取出手段と、受信判定手段によって当該ポインタ変数は第一所定値であると判定された場合に、取り出しスレッドが、対応する送受信リンクリストから取り出し可能なレコードを格納するノードは無い状態であると判断するように各スレッドを制御する状態判断手段と、を備えることを特徴とする。
【００１９】
本発明の一形態に係るスレッド間通信システムでは、各スレッドには、他のスレッドの数に相当する数だけ送受信リンクリストが用意されており、各送受信リンクリストは、互いに異なる他のスレッドの一つと対応付けられ、当該対応付けられたスレッドから送信されたレコードを格納順を指定してノードに格納することが可能である。そして、このスレッド間通信システムによれば、レコードの送信元である送信スレッドが、当該レコードを格納した新規ノードを生成して、当該レコードの送信先である受信スレッドと対応する送受信リンクリストに追加する場合に、当該新規ノードのポインタ変数に第一所定値を設定しつつ当該新規ノードを当該送受信リンクリストの末尾に追加して格納する。次に、取り出しスレッドが、当該レコードを対応する送受信リンクリストから取り出す場合に、当該送受信リンクリストの先頭ノードのポインタ変数が第一所定値であるか否かを判定する。そして、当該ポインタ変数は第一所定値でないと判定された場合に、取り出しスレッドが、当該ポインタ変数が指す場所のノードからレコードを取り出しつつ当該ノードを新たな先頭ノードとして設定する。一方、当該ポインタ変数は第一所定値であると判定された場合に、取り出しスレッドが、対応する送受信リンクリストから取り出し可能なレコードを格納するノードは無い状態であると判断する。
【００２０】
これにより、各スレッドには他のスレッドの数に相当する数だけ送受信リンクリストが用意されており、送信スレッドが新規ノードを生成して送信先の送受信リンクリストの末尾に追加して格納する。また、取り出しスレッドが、上記ポインタ変数が第一所定値でない場合に当該ポインタ変数が指す場所のノードからレコードを取り出す。一方、当該ポインタ変数は第一所定値である場合に、取り出し可能なレコードは無い状態であると判断される。このように、各スレッドには他のスレッドの数に相当する数だけ送受信リンクリストが用意された上で、送信スレッドによる送受信リンクリストへのノードの格納と、取り出しスレッドによる送受信リンクリストからのレコードの取り出しとが行われるため、ＣＡＳ操作を利用せずに、矛盾なく情報の受け渡しをすることが可能になり且つウェイトフリーになる。
【００２１】
本発明の一形態に係るスレッド間通信プログラムは、レコードを格納可能なノードの場所を指すポインタ情報が格納されるポインタ変数からの当該ポインタ情報の読み込み処理と、当該ポインタ変数へのポインタ情報の書き込み処理とが、不可分に可能な環境において、複数のスレッドが互いにレコードを送受信可能なように当該複数のスレッドを制御するスレッド間通信システムとしての機能を、コンピュータに実現させるスレッド間通信プログラムであって、各スレッドには、他のスレッドの数に相当する数だけ送受信リンクリストが用意されており、各送受信リンクリストは、互いに異なる他のスレッドの一つと対応付けられ、当該対応付けられたスレッドから送信されたレコードを格納順を指定してノードに格納することが可能であり、コンピュータに、レコードの送信元である送信スレッドが、当該レコードを格納した新規ノードを生成して、当該レコードの送信先である受信スレッドと対応する送受信リンクリストに追加する場合に、当該新規ノードのポインタ変数に第一所定値を設定しつつ当該新規ノードを当該送受信リンクリストの末尾に追加して格納するように各スレッドを制御する受信追加手段の機能と、送受信リンクリストからレコードを取り出す取り出しスレッドが、当該レコードを対応する送受信リンクリストから取り出す場合に、当該送受信リンクリストの先頭ノードのポインタ変数が第一所定値であるか否かを判定するように各スレッドを制御する受信判定手段の機能と、受信判定手段の機能によって当該ポインタ変数は第一所定値でないと判定された場合に、取り出しスレッドが、当該ポインタ変数が指す場所のノードからレコードを取り出しつつ当該ノードを新たな先頭ノードとして設定する処理を行うように各スレッドを制御する受信取出手段の機能と、受信判定手段の機能によって当該ポインタ変数は第一所定値であると判定された場合に、取り出しスレッドが、対応する送受信リンクリストから取り出し可能なレコードを格納するノードは無い状態であると判断するように各スレッドを制御する状態判断手段の機能と、を実現させることを特徴とする。
【００２２】
本発明の一形態に係るスレッド間通信プログラムでは、各スレッドには、他のスレッドの数に相当する数だけ送受信リンクリストが用意されており、各送受信リンクリストは、互いに異なる他のスレッドの一つと対応付けられ、当該対応付けられたスレッドから送信されたレコードを格納順を指定してノードに格納することが可能である。そして、このスレッド間通信プログラムによれば、レコードの送信元である送信スレッドが、当該レコードを格納した新規ノードを生成して、当該レコードの送信先である受信スレッドと対応する送受信リンクリストに追加する場合に、当該新規ノードのポインタ変数に第一所定値を設定しつつ当該新規ノードを当該送受信リンクリストの末尾に追加して格納する。次に、取り出しスレッドが、当該レコードを対応する送受信リンクリストから取り出す場合に、当該送受信リンクリストの先頭ノードのポインタ変数が第一所定値であるか否かを判定する。そして、当該ポインタ変数は第一所定値でないと判定された場合に、取り出しスレッドが、当該ポインタ変数が指す場所のノードからレコードを取り出しつつ当該ノードを新たな先頭ノードとして設定する。一方、当該ポインタ変数は第一所定値であると判定された場合に、取り出しスレッドが、対応する送受信リンクリストから取り出し可能なレコードを格納するノードは無い状態であると判断する。
【００２３】
これにより、各スレッドには他のスレッドの数に相当する数だけ送受信リンクリストが用意されており、送信スレッドが新規ノードを生成して送信先の送受信リンクリストの末尾に追加して格納する。また、取り出しスレッドが、上記ポインタ変数が第一所定値でない場合に当該ポインタ変数が指す場所のノードからレコードを取り出す。一方、当該ポインタ変数は第一所定値である場合に、取り出し可能なレコードは無い状態であると判断される。このように、各スレッドには他のスレッドの数に相当する数だけ送受信リンクリストが用意された上で、送信スレッドによる送受信リンクリストへのノードの格納と、取り出しスレッドによる送受信リンクリストからのレコードの取り出しとが行われるため、ＣＡＳ操作を利用せずに、矛盾なく情報の受け渡しをすることが可能になり且つウェイトフリーになる。
【発明の効果】
【００２４】
本発明によれば、スレッド間において、ＣＡＳ操作を利用せずに、矛盾なく情報の受け渡しをすることが可能でウェイトフリーなスレッド間通信方法及びスレッド間通信システムを提供することができる。
【図面の簡単な説明】
【００２５】
【図１】スレッド間通信システムの主な機能構成の概略を説明するための機能ブロック図である。
【図２】スレッド間通信システムによる、例として三つのスレッド間での通信の一例を説明するための説明図である。
【図３】図２において特定の一つのスレッドのみに着目した場合の説明図である。
【図４】入力データ中の各レコードを処理する担当スレッドを、例として三つのスレッドの中から、ｍｏｄｕｌｏにて決定した場合の一例を説明するための説明図である。
【図５】実行制御部による処理の流れを説明するためのフローチャートである。
【図６】プールからのノードの取り出しと、取り出したノードのパイプへの追加の様子の詳細を説明するための説明図である。
【図７】図６に示される処理の流れを説明するためのフローチャートである。
【図８】パイプからのノードの取り出しと、取り出したノードのプールへの追加の様子の詳細を説明するための説明図である。
【図９】図８に示される処理の流れを説明するためのフローチャートである。
【図１０】ノードを末尾に追加するプールがラウンドロビンで選択される様子を説明するための説明図である。
【図１１】スレッド間通信プログラムのモジュール構成を示すブロック図である。
【発明を実施するための形態】
【００２６】
以下、添付図面を参照しながら本発明に係る情報提供装置及び情報提供方法の実施形態を説明する。なお、図面の説明において同一要素には同一符号を付し、重複する説明を省略する。
【００２７】
（１）本実施形態におけるスレッド間通信システムの構成
まず、本実施形態におけるスレッド間通信システムの構成について、図１〜図３を用いて説明する。図１は、本実施形態におけるスレッド間通信システム１０の主な機能構成の概略を説明するための機能ブロック図である。また、図２は、スレッド間通信システム１０による、例として三つのスレッド間での通信の一例を説明するための説明図である。また、図３は、図２における特定の一つのスレッドのみに着目した場合の説明図である。
【００２８】
図１に示されるスレッド間通信システム１０は、複数のスレッドが互いにレコードを送受信可能なように当該複数のスレッドを制御するシステムである。スレッド間通信システム１０は、実行中のプログラム内の全てのスレッド毎に対応して存在するように、各スレッド内で生成される。スレッド間通信システム１０は、ＣＡＳ操作を利用せずに、スレッド間において矛盾なくレコード（情報）の受け渡しをすることを可能にする。レコードは、ノードに格納することが可能なデータであり、ノードの場所（アドレス）は、ポインタ情報によって指し示される。ポインタ情報は、ポインタ変数に格納することが可能な情報である。ノードは、ポインタ変数を有することが可能であり、ポインタ変数は、当該ノードの次に格納されている後続ノードの場所（アドレス）を指し示す。また、スレッド間通信システム１０は、ポインタ変数からのポインタ情報の読み込み処理と、当該ポインタ変数へのポインタ情報の書き込み処理とを、不可分に行える環境に存在する。
【００２９】
なお、図２に示されるように、各スレッドには、他のスレッドの数に相当する数だけリンクリストであるパイプ（送受信リンクリスト）が用意されている。例えば、スレッドＴ０は、他のスレッドの数（スレッドＴ１，Ｔ２の二つ）に相当する数のパイプＰ０−１，Ｐ０−２を用意する。各パイプは、互いに異なる他のスレッドの一つと対応付けられ、当該対応付けられたスレッドから送信されたレコードを格納順を指定してノードに格納することが可能である。例えば、図３に示されるように、パイプＰ０−１はスレッドＴ１と対応付けられ、パイプＰ０−２はスレッドＴ２と対応付けられている。そして、パイプＰ０−１は、スレッドＴ１から送信されたレコードを格納順を指定してノードに格納することが可能であり、パイプＰ０−２は、スレッドＴ２から送信されたレコードを格納順を指定してノードに格納することが可能である。
【００３０】
同様に、図２に示されるように、各スレッドには、他のスレッドの数に相当する数だけリンクリストであるプール（保管リンクリスト）が用意されている。例えば、スレッドＴ０には、他のスレッドの数（スレッドＴ１，Ｔ２の二つ）に相当する数のプールＱ０−１，Ｑ０−２が用意されている。各プールは、互いに異なる他のスレッドの一つと対応付けられ、レコードが取り出された使用済みノードを格納することが可能である。例えば、図３に示されるように、プールＱ０−１はスレッドＴ１と対応付けられ、プールＱ０−２はスレッドＴ２と対応付けられている。そして、パイプＰ０−１に格納されているノードからスレッドＴ０によってレコードが取り出されると、プールＱ０−１は、当該レコードが取り出された使用済みノード７１１を末尾に格納することが可能である。また、パイプＰ０−２に格納されているノードからスレッドＴ０によってレコードが取り出されると、当該レコードが取り出された使用済みノード（図示せず）を末尾に格納することが可能である。
【００３１】
スレッド間通信システム１０は、図１に示されるように、実行制御部１０１（実行制御手段）、担当スレッド判断部１０２（担当スレッド判断手段）、データ入力部１０３（データ入力手段）、データ処理部１０４（データ処理手段）、レコード転送部１０５（レコード転送手段）、パイプ管理部１０６（受信追加手段、受信判定手段、受信取出手段、及び状態判断手段）、プール管理部１０７（送信格納手段、送信判定手段、送信取出手段、及び送信生成手段）、及び終了条件判断部１０８（終了条件判断手段）を備えて構成されている。
【００３２】
実行制御部１０１は、各部１０２〜１０８と通信することにより、他のスレッドとの情報の受け渡しを実行するのに必要な制御を行う制御部分である。例えば、実行制御部１０１は、対応するスレッドへの入力データを、データ入力部１０３から担当スレッド判断部１０２に一定件数読み込ませる制御を行う。ここでは、入力データとは、複数のレコードの集合体であるとする。
【００３３】
また、実行制御部１０１は、当該スレッドにおいてデータ処理部１０４が処理すべきデータの取得元の制御を行う。より詳しくは、実行制御部１０１は、担当スレッド判断部１０２による入力データの処理件数が一定件数に達すると、当該スレッドの処理すべきデータの取得元をパイプ管理部１０６に切り替える制御を行う。ここで、パイプ管理部１０６に、他スレッドから転送されてきたレコードが存在する場合、実行制御部１０１は、当該レコード全てをデータ処理部１０４に処理させる。パイプ管理部１０６に蓄えられたレコード全ての処理が完了すると、実行制御部１０１は、再び、入力データの取得元をデータ入力部１０３に切り替える。以降、実行制御部１０１は、入力データの取得元を切り替えながら、レコードを順次処理していく。
【００３４】
データ入力部１０３は、スレッド間通信システム１０に対応した当該スレッドへの入力データを、担当スレッド判断部１０２に転送して読み込ませる入力処理部分である。
【００３５】
担当スレッド判断部１０２は、入力データ中の各レコードを処理すべき担当スレッドを、所定の方法で判断して決定する。所定の方法とは、例えば、後述するように、各レコードのキーのハッシュ値の、スレッドの総数によるｍｏｄｕｌｏにて決定する方法であってもよく、その他の方法を予め指定する指定手段をプログラマや利用者に提供してもよい。本実施例では、詳細は後述するが、各レコードのキーのハッシュ値の、スレッド総数によるｍｏｄｕｌｏがいずれのスレッドの番号（例：スレッドの数がＮならば、０以上Ｎ−１以下の各整数）と一致するか否かによって判断する方法を用いる。
【００３６】
ここで、自スレッドが処理すべきであると判断された入力レコードは、データ処理部１０４に転送されて処理される。一方、他スレッドが処理すべきであると判断された入力レコードは、レコード転送部１０５によって、該当する他スレッドのパイプ管理部へ転送される。自スレッドと他のスレッドとの間といったようなスレッド間でのレコードの受け渡しには、リンクリストが用いられる。このとき、レコード転送部１０５は、リンクリストの要素となるノードの中で、レコードを格納する際に再利用が可能なノードが存在するかを、当該他スレッドのプール管理部へ問い合わせることが可能である。問い合わせの結果、再利用が可能なノードが存在する場合、レコード転送部１０５が、当該再利用可能なノードを新規ノードとして再利用する。
【００３７】
データ処理部１０４は、担当スレッド判断部１０２によって処理すべきと判断された入力レコードを処理する処理実行部分である。更に、データ処理部１０４は、パイプ管理部１０６にレコードが存在する場合に、当該レコードを処理する。
【００３８】
レコード転送部１０５は、担当スレッド判断部１０２によって他スレッドが処理すべきと判断された入力レコードを当該他スレッドに転送する通信処理部分である。レコード転送部１０５は、担当スレッド判断部１０２から受信した入力レコードを、他のスレッドのパイプ管理部に転送する。各スレッド内のレコード転送部１０５は、他の全てのスレッドのパイプ管理部およびプール管理部と通信可能なように接続されている。
【００３９】
パイプ管理部１０６は、他スレッドから転送されてきたレコードを格納した新規ノードを、自スレッドに対応して用意されたパイプの末尾に追加して格納する処理を、当該他スレッドに行わせるノード管理部分である。まず、他スレッドのレコード転送部が、パイプ管理部１０６へレコードを転送する際に、プールが用いられる構成であれば、当該プールのプール管理部１０７に対して再利用可能なノードがあるかを問い合わせる。ここで、再利用可能なノードが有る場合に、他スレッドは、当該ノードを再利用する。一方で、再利用可能なノードが無い場合に、他スレッドは、当該レコードを格納した新規ノードを生成させる。そして、他スレッドのレコード転送部は、当該新規ノードのポインタ変数に無効値（第一所定値）を設定させつつ、当該新規ノードを対応するパイプの末尾に追加して格納する。
【００４０】
また、パイプ管理部１０６は、データ処理部１０４によるパイプ内のレコードの処理が行われる際に、当該レコードを当該パイプから取り出す。この場合に、パイプ管理部１０６は、パイプの先頭ノードのポインタ変数が無効値（第一所定値）であるか否かを判定する。ここで、当該ポインタ変数が無効値（第一所定値）でないと判定された場合に、パイプ管理部１０６は、自スレッドが、当該ポインタ変数が指す場所のノードからレコードを取り出しつつ当該ノードを新たな先頭ノードとして設定する処理を行うよう制御する。一方、当該ポインタ変数は無効値（第一所定値）であると判定された場合に、パイプ管理部１０６は、自スレッドが、当該パイプから取り出し可能なレコードを格納するノードは無い状態であると判断するよう制御する。
【００４１】
プール管理部１０７は、パイプ管理部１０６の制御によって自スレッドがノードからレコードを取り出す処理を行った場合に、当該レコードが取り出された使用済みノードを再利用するノード管理部である。プール管理部１０７は、ノードからレコードが取り出される処理が行われると、当該レコードが取り出された使用済みノードのポインタ変数（次に格納されている後続ノードの場所を指す）に、無効値（第二所定値）を設定しつつ、当該使用済みノードをプールの末尾に追加して格納する。
【００４２】
また、プール管理部１０７は、他スレッドのレコード転送部によるパイプ管理部１０６へのレコードの転送を検知すると、当該他スレッドから再利用可能なノードの存在についての問い合わせを受けて、再利用可能なノードがプールに格納されていれば、当該再利用可能なノードの存在を当該他スレッドに通知する。より詳しくは、プール管理部１０７は、他スレッドのレコード転送部によるパイプ管理部１０６へのレコードの転送を検知すると、プールにおける先頭ノードのポインタ変数が無効値（第二所定値）であるか否かを判定する。ここで、当該ポインタ変数が無効値（第二所定値）でないと判定された場合に、プール管理部１０７は、プールにおける先頭ノードを当該プールから取り出して新規ノードとして再利用しつつ当該再利用ノードの次にプールに格納されている後続ノードを新たな先頭ノードとして設定する。一方、当該ポインタ変数は無効値（第二所定値）であると判定された場合に、他スレッドが新規ノードを生成する。
【００４３】
また、プール管理部１０７は、レコードが取り出された使用済みノードのポインタ変数（次に格納されている後続ノードの場所を指す）に、無効値（第二所定値）を設定した際に、当該使用済みノードを末尾に追加するプールを複数のプールの中からラウンドロビン方式で選択し、当該選択されたプールの末尾に当該使用済みノードを追加することが可能である。
【００４４】
終了条件判断部１０８は、所定の条件が満たされた場合に、自スレッドによる処理が終了したと判断する判断処理部分である。所定の条件とは、「自スレッドにおける入力データの処理が全て完了し終了したこと」、「他のスレッドにおける入力データの処理が全て完了し終了したこと」、且つ「自スレッドの全てのパイプ管理部１０６にレコードが残っていないこと」のＡＮＤ条件である。
【００４５】
（２）スレッド間通信システムによるスレッド間通信の一例
引き続き、スレッド間通信システム１０によるスレッド間通信の一例について、図２及び図３を用いて説明する。図２に示されるように、ここでは、一例として、三つのスレッドＴ０〜Ｔ２によるスレッド間通信が行われるとして説明する。なお、三つのスレッドＴ０〜Ｔ２のそれぞれには、各スレッドに対応したスレッド間通信システム（図示せず）が存在している。また、一例として、三つのスレッドＴ０〜Ｔ２のそれぞれにより、ハッシュテーブルＨ０〜Ｈ２のそれぞれの編集処理が行われるとする。
【００４６】
ここで、三つのスレッドＴ０〜Ｔ２のそれぞれには、他のスレッドのそれぞれとの通信に用いる専用のリンクリストであるパイプ及びプールが用意されている。また、スレッド間通信システム１０の制御によって、各プールから使用済みノードの取り出し処理が可能なスレッドは、一つに限定されている。更に、スレッド間通信システム１０の制御によって、各パイプに対するノードの書き込み処理が可能なスレッドは、一つに限定されている。
【００４７】
具体的には、スレッドＴ０には、スレッドＴ１との通信に用いる専用のリンクリストであるパイプＰ０−１及びプールＱ０−１が用意されており、且つ、スレッドＴ２との通信に用いる専用のリンクリストであるパイプＰ０−２及びプールＱ０−２が用意されている。同様に、スレッドＴ１には、スレッドＴ２との通信に用いる専用のリンクリストであるパイプＰ１−２及びプールＱ１−２が用意されており、且つ、スレッドＴ０との通信に用いる専用のリンクリストであるパイプＰ１−０及びプールＱ１−０が用意されている。更に、スレッドＴ２には、スレッドＴ０との通信に用いる専用のリンクリストであるパイプＰ２−０及びプールＱ２−０が用意されており、且つ、スレッドＴ１との通信に用いる専用のリンクリストであるパイプＰ２−１及びプールＱ２−１が用意されている。
【００４８】
そして、図３に示されるように、一例としてスレッドＴ０に入力データＤ０が入力されると、自スレッドで処理すべきレコードに関しては、ハッシュテーブルＨ０へ格納される。また、担当スレッド判断部１０２によって他スレッドであるスレッドＴ１で処理すべきと判断されたレコードに関しては、パイプＰ１−０に転送され、ハッシュテーブルＨ１へ格納される。同様に、担当スレッド判断部１０２によって他スレッドであるスレッドＴ２で処理すべきと判断されたレコードに関しては、パイプＰ２−０に転送され、ハッシュテーブルＨ２へ格納される。
【００４９】
このように、三つのスレッドＴ０〜Ｔ２のそれぞれには、他のスレッドのそれぞれとの通信に用いる専用のリンクリストであるパイプ及びプールが用意されており、処理可能なスレッドが一つに限定されていることにより、ノードの追加時におけるスレッド間競合も、ノードの取り出しにおけるスレッド間競合も、発生しない。
【００５０】
ここでは、ＣＡＳ操作が可能な環境よりも広範な環境（全ての計算機、演算端末、及び／又はプログラミング言語）でサポートされている基本特性、すなわち、データとしてのレコードを格納可能なノードの場所を指すポインタ情報が格納されるポインタ変数へのポインタ値の書き込み処理と、ポインタ変数からのポインタ値の読み込み処理とは、共に不可分に行われる、という特性が利用される。
【００５１】
なお、プール及びパイプといったリンクリストからノードの取り出しを行う取り出しスレッドは、先頭ノードのポインタ変数（後続のノードの場所を指す）が無効値であれば、後続ノードが存在しないと判断できる。一方、先頭ノードのポインタ変数（後続のノードの場所を指す）が無効値でなければ（有効な値であれば）、当該スレッドは、当該後続ノードを取り出すことが可能である。また、プール及びパイプといったリンクリストへのノードの追加を行う追加スレッドは、追加すべきノードを生成し、生成した当該ノードのポインタ変数（後続のノードの場所を指す）に無効値を設定してから、当該リンクリストの末尾ノードのポインタ変数（後続のノードの場所を指す）に当該生成した追加すべきノードのポインタ値を設定する。
【００５２】
これにより、リンクリストにおいて、排他ロック機構やＣＡＳ操作を利用することなく、取り出しスレッドと追加スレッドとの間での競合が解決され、矛盾なくデータの受け渡しを行うことが可能になる。このように、排他ロック機構を用いないことによりロックフリーを実現し、且つＣＡＳ操作を用いないことから、ポインタ情報の読み書きは必ず有限の時間で終了するため、ウェイトフリーの実現が可能になる。
【００５３】
（３）入力データ中の各レコードの担当スレッドをｍｏｄｕｌｏにて決定した場合の一例
引き続き、担当スレッド判断部１０２が、入力データ中の各レコードを処理する担当スレッドをｍｏｄｕｌｏにて決定した場合の一例について、図４を用いて説明する。図４は、入力データ中の各レコードを処理する担当スレッドを、例として三つのスレッドの中から、ｍｏｄｕｌｏにて決定した場合の一例を説明するための説明図である。
【００５４】
図４（ａ）に示されるように、スレッド０〜２という三つのスレッド間での通信が行われている状況において、スレッド０に入力データ０が入力され、スレッド１に入力データ１が入力され、スレッド３に入力データ２が入力されたとする。ここで、入力データ０は、Ｒｅｃｏｒｄ０−１〜Ｒｅｃｏｒｄ０−６の六つのデータにより構成され、Ｒｅｃｏｒｄ０−１〜Ｒｅｃｏｒｄ０−６のそれぞれのデータのキーのハッシュ値は、ｍｏｄ３（スレッドの総数である３で除した際の余り）であったとする。例えば、Ｒｅｃｏｒｄ０−１のデータのキーのハッシュ値は、「０」であり、Ｒｅｃｏｒｄ０−４のデータのキーのハッシュ値は、「１」であり、Ｒｅｃｏｒｄ０−２のデータのキーのハッシュ値は、「２」であったとする。
【００５５】
ここで、図４（ｂ）に示されるように、キーのハッシュ値が「０」であるレコードは、スレッド０が管理するハッシュテーブル０に対する編集処理に用いられ、キーのハッシュ値が「１」であるレコードは、スレッド１が管理するハッシュテーブル１に対する編集処理に用いられ、キーのハッシュ値が「２」であるレコードは、スレッド２が管理するハッシュテーブル２に対する編集処理に用いられる。これにより、スレッド０に入力されたＲｅｃｏｒｄ０−１はスレッド０における直接処理となり、スレッド０に入力されたＲｅｃｏｒｄ０−４はスレッド１における処理のためパイプ１−０（スレッド０からの転送レコードが追加される、スレッド１に用意されたリンクリスト）に追加され、スレッド０に入力されたＲｅｃｏｒｄ０−２はスレッド２における処理のためパイプ２−０（スレッド０からの転送レコードが追加される、スレッド２に用意されたリンクリスト）に追加される。
【００５６】
（４）スレッド間通信システムによる処理の流れ
引き続き、スレッド間通信システム１０による処理の流れ（スレッド間通信方法）について、図５を用いて説明する。図５は、実行制御部１０１による処理の流れを説明するためのフローチャートである。
【００５７】
図５に示されるように、まず、各スレッドが、自スレッドの入力データの処理から始め、入力データにおける未処理のレコードが残っているか否かを判断する（ステップＳ３０１）。入力データにおける未処理のレコードが残っている場合、担当スレッド判断部１０２に、上述の所定の方法で、当該レコードの担当スレッドは自スレッドであるか否かを判断させる（ステップＳ３０２、決定ステップ）。一方、入力データにおける未処理のレコードが残っておらず、全ての処理が完了した場合、ステップＳ３０７に移行する。
【００５８】
ステップＳ３０２において、当該レコードは自スレッドが担当すべきであると判断された場合は、データ処理部１０４に当該レコードが転送されて処理される（ステップＳ３０３、自己処理ステップ）。そして、後述のステップＳ３０４に移行する。一方、当該レコードは他スレッドが担当すべきであると判断された場合は、上述の所定の方法にて担当スレッドが決定されて、レコード転送部１０５が、当該レコードを、担当スレッドに転送する（ステップＳ３０６、送信ステップ）。そして、後述のステップＳ３０４に移行する。
【００５９】
ステップＳ３０４において、データ入力部１０３が、処理済みレコード数（自スレッドで処理を担当すべきと判断された入力レコードの総数と、他スレッドで処理を担当すべきと判断された入力レコードの総数との合計である入力レコード合計数）のカウンタ値を１つ増やし、入力レコードが一定数（固定の数値であってもよく、処理開始時に指定された数値であってもよく、設定ファイル等で予め指定されていてもよい）だけ処理されたか否かを判断する（ステップＳ３０４）。一定数に未到達の場合は、ステップＳ３０１へ戻る。一方、一定数に到達した場合は、データ処理部１０４が、上述のカウンタ値を０にリセットすると、パイプ処理（パイプ管理部１０６における、他スレッドから転送されてきたレコードの、データ処理部１０４による処理）が行われる（ステップＳ３０５）。このパイプ処理が完了すると、ステップＳ３０１へ戻る。
【００６０】
ステップＳ３０７では、終了条件判断部１０８が、上記終了条件が成り立つか否かを判定する。上記終了条件が満たされなければ、パイプ処理が行われると（ステップＳ３０８）、ステップＳ３０７へ戻る。すなわち、上述の終了条件が成り立つまで、パイプ処理Ｓ３０５（自スレッドが、自スレッドに対応したパイプ内のレコードを処理すること）が繰り返し呼び出される。このように、上述の終了条件が成り立つまで、パイプ処理が繰り返し呼び出されるのは、他スレッドの全てにおける処理が完了するまで、自スレッド宛のノードが他スレッドからパイプに転送される可能性があるためである。
【００６１】
ステップＳ３０７において、上記終了条件が成り立つと判定されると、自スレッドにおける処理が完了する。なお、スレッド間通信プログラム全体としては、全てのスレッドにおいて上記終了条件が成立（ステップＳ３０７：Yes）した時点で、スレッド間通信プログラムにおける処理終了となる。
【００６２】
（５）プールからのノードの取り出しと、取り出したノードのパイプへの追加の様子
引き続き、図３に示される、担当スレッドＴ０によるレコード受信処理において行われる、プールＱ０−１から、再利用するノードである再利用ノード５１１を取り出して、取り出した再利用ノード５１１に受信レコードを格納してパイプＰ０−１へ追加する様子の詳細について、図６を用いて説明する。図６は、プールｍ−ｎ５２０からの再利用ノード５１１の取り出しと、取り出した再利用ノード５１１のパイプｍ−ｎ５２１への追加の様子の詳細を説明するための説明図である。
【００６３】
なお、ここでは、レコードの受け取り側をスレッドｍとし、レコードの渡し側をスレッドｎとする（すなわち、レコードがスレッドｎからスレッドｍへ受け渡される）。また、ここでは、スレッドｎが有するレコード転送部１０５と、スレッドｍが有するパイプ管理部１０６及びプール管理部１０７が協調して動作することになるが、これらは全てスレッドｎによって制御（操作）される。更に、この時使用されるパイプ及びプールは、それぞれパイプｍ−ｎ及びプールｍ−ｎであるとして、説明する。
【００６４】
ここに示される例では、パイプｍ−ｎ５２０及びプールｍ−ｎ５２１内が「物理的に空」（すなわち、ノードがゼロ個の状態）にならないよう、常に一個のダミーノードが存在する。パイプｍ−ｎ５２０及びプールｍ−ｎ５２１といったリンクリスト内のノード総数が最低限である一個の場合、ダミーノードは先頭ノード（同時に末尾ノード）であり（「物理的に空」ではないが「論理的に空」の状態）、当該リンクリスト内のノード総数が二個以上の場合、ダミーノードはこれらのノードにおける先頭に配置されている（「物理的に空」でもなく「論理的に空」でもない状態）。また、パイプｍ−ｎ５２０内が「論理的に空」とは、（ダミーノードのみ存在するが、）取り出すべきレコードを格納したノードが無い状態を意味する。なお、当該ダミーノードのポインタ変数には無効値が設定されている。また、プールｍ−ｎ５２１内が「論理的に空」とは、（上記のダミーノードのみ存在するが、）再利用可能なノードが無い状態を意味する。同様に、当該ダミーノードのポインタ変数には無効値が設定されている。
【００６５】
プールｍ−ｎ５２０では、例えば先頭ノードへの場所を指すポインタ情報を格納したポインタ変数５１３が用いられている。これにより、プールｍ−ｎ５２０から先頭ノードを取り出すスレッドが、先頭ノードを容易に特定することができる。この例では最初に、先頭ノードへのポインタ変数５１３は、先頭ノード５１１を指している。また、先頭ノード５１１のポインタ変数（後続のノードの場所を指す）は、ノード５１２を指している。更に、ノード５１２のポインタ変数（後続のノードの場所を指す）には、無効値が格納されている。
【００６６】
プールｍ−ｎ５２０内にダミーノードしか存在しない空状態であるかどうかは、上記の取り出しスレッドが、例えば先頭ノード５１１のポインタ変数が無効値であるか否かに基づいて、判定する。ここでは、最初に、先頭ノード５１１のポインタ変数は無効値でないため、上述の空状態ではない。
【００６７】
ここで、スレッドｎのレコード転送部１０５は、ステップＳ５０１にて、プールｍ−ｎ５２０の先頭ノード５１１を取り出しつつ、ステップＳ５０２にて、先頭ノードへのポインタ変数５１３が、ノード５１１の後続であるノード５１２を指すように設定する（受信取出ステップ）。先頭ノードとなったノード５１２のポインタ変数（後続のノードの場所を指す）には、無効値が格納されているため、プールｍ−ｎ５２０は空状態になる。
【００６８】
次に、スレッドｎのレコード転送部１０５は、ステップＳ５０３にて、ノード５１１のレコードスペースに、担当スレッドＴ０に渡すべきレコードを設定しつつ（設定後に「レコードスペース」から「レコード」となる）、ノード５１１のポインタ変数（後続のノードの場所を指す）に無効値を設定する（受信追加ステップ）。
【００６９】
また、パイプｍ−ｎ５２１では、例えば末尾ノードへの場所を指すポインタ情報を格納したポインタ変数５１５が用いられている。これにより、パイプｍ−ｎ５２１の末尾にノードを追加するスレッドが、末尾ノードを容易に特定することができる。この例では最初に、末尾ノードへのポインタ変数５１５は、末尾ノード５１４を指している。また、末尾ノード５１４のポインタ変数（後続のノードの場所を指す）には、無効値が格納されている。このため、パイプｍ−ｎ５２１は空状態になっている。
【００７０】
ここで、スレッドｎのレコード転送部１０５は、ステップＳ５０４にて、パイプｍ−ｎ５２１の末尾にノード５１１を追加する処理を行う（受信追加ステップ）。これは、ノード５１４のポインタ変数（後続のノードの場所を指す）に、ノード５１１のポインタ情報を設定することで実現される。更に、ステップＳ５０５にて、末尾ノードへのポインタ変数５１５のポインタ情報にも、ノード５１１のポインタ情報が設定される。
【００７１】
このように、担当スレッドＴ０向けにレコードが渡される際に、プールｍ−ｎ５２０から使用済みノード５１１が取り出され、取り出されたノード５１１に当該レコードが格納されて、当該ノード５１１がパイプｍ−ｎ５２１の末尾へ追加される（使用済みノードの再利用）。
【００７２】
（６）プールからのノードの取り出しと、取り出したノードのパイプへの追加の際の処理の流れ
引き続き、図６に示される処理の流れについて、図７を用いて説明する。図７は、図６に示される処理の流れを説明するためのフローチャートである。
【００７３】
図７に示されるように、まず、スレッドｍのプール管理部１０７が、スレッドｎのレコード転送部によるスレッドｍのパイプ管理部１０６へのレコードの転送を検知すると、プールｍ−ｎ５２０の先頭ノード５１１のポインタ変数が無効値であるか否かを判定することによって、プール管理部１０７が、プールｍ−ｎ５２０に利用可能な空きノード（再利用可能なノード）があるかどうかを判断する（ステップＳ４０１、受信判定ステップ）。プールｍ−ｎ５２０の先頭ノード５１１のポインタ変数が無効値でないことから、プールｍ−ｎ５２０に利用可能な空きノードがあると判定された場合、プール管理部１０７が、プールｍ−ｎ５２０の先頭ノード５１１を取り出し（ステップＳ４０２、受信取出ステップ）、ステップＳ４０４に移行する。一方、プールｍ−ｎ５２０の先頭ノード５１１のポインタ変数が無効値であることから、プールｍ−ｎに利用可能な空きノードが無いと判定された場合、新規のノードを生成する（ステップＳ４０３、状態判断ステップ）。そして、ステップＳ４０４に移行する。
【００７４】
ステップＳ４０４では、プール管理部１０７が、取り出したノード５１１（又は生成した新規のノード）に対して、担当スレッドＴ０が受信することになる受け渡すべきレコードに関する情報を設定し、且つ、当該ノードのポインタ変数（後続のノードの場所を指す）に無効値を設定する（受信取出ステップ）。そして、プール管理部１０７が、当該ノードを、パイプｍ−ｎ５２１の末尾に追加する処理を行う（ステップＳ４０５）。そして、一連の処理は終了する。
【００７５】
（７）パイプからのノードの取り出しと、取り出したノードのプールへの戻し方の様子
引き続き、図３に示される、担当スレッドＴ０によるレコード受信処理において行われる、パイプＰ０−１からノード７１１を取り出して、取り出したノード７１１からレコードを取り出した後、当該使用済みノード７１１をプールＱ０−１へ追加する様子の詳細について、図８を用いて説明する。図８は、パイプｍ−ｎ７２０からのノード７１１の取り出しと、取り出したノード７１１のプールｍ−ｎ７２１への追加の様子の詳細を説明するための説明図である。
【００７６】
なお、ここでは、レコードの受け取り側をスレッドｍとし、レコードの渡し側をスレッドｎとする（すなわち、スレッドｎから渡されたレコードをスレッドｍが取り出す）。また、この時使用されるパイプ及びプールは、それぞれパイプｍ−ｎ及びプールｍ−ｎであって、これらは全てスレッドｍによって制御（操作）される。
【００７７】
パイプｍ−ｎ７２０では、例えば先頭ノードへのポインタ情報を格納したポインタ変数７１３が用いられている。これにより、パイプｍ−ｎ７２０の先頭から先頭ノードを取り出すスレッドが、先頭ノードを容易に特定することができる。この例では最初に、先頭ノードへのポインタ変数７１３は、先頭ノード７１１を指している。また、先頭ノード７１１のポインタ変数（後続のノードの場所を指す）は、ノード７１２を指している。更に、ノード７１２のポインタ変数（後続のノードの場所を指す）には、無効値が格納されている。
【００７８】
パイプｍ−ｎ７２０内にダミーノードしか存在しない空状態であるかどうかは、スレッドが、例えば先頭ノード７１１のポインタ変数が無効値であるか否かに基づいて、判定する。ここでは、最初に、先頭ノード７１１のポインタ変数は無効値でないため、上述の空状態ではない。
【００７９】
ここで、スレッドｍのパイプ管理部１０６は、ステップＳ７０１にて、パイプｍ−ｎ７２０の先頭ノード７１１のポインタ情報が指し示すノード７１２のレコードを用いた処理を行いつつ（なお、当該処理の後、ノード７１２の「レコード」は消去されて「レコードスペース」となる）、先頭ノードへのポインタ変数７１３が、当該ノード７１２を指すように設定する。先頭ノードとなったノード７１２のポインタ変数（後続のノードの場所を指す）には、無効値が格納されているため、パイプｍ−ｎ７２０は空状態になる。
【００８０】
次に、スレッドmのパイプ管理部１０６は、ステップＳ７０２にて、元々は先頭ノードだったノード７１１を取り出し、ステップＳ７０３にて、使用済みノード７１１のポインタ変数（後続のノードの場所を指す）に無効値を設定する（取出格納ステップ、先頭取出ステップ）。
【００８１】
また、プールｍ−ｎ７２１では、例えば末尾ノードへの場所を指すポインタ情報を格納したポインタ変数７１５が用いられている。これにより、プールｍ−ｎ７２１の末尾にノードを追加するスレッドが、末尾ノードを容易に特定することができる。この例では最初に、末尾ノードへのポインタ変数７１５は、末尾ノード７１４を指している。また、末尾ノード７１４のポインタ変数（後続のノードの場所を指す）には、無効値が格納されている。このため、プールｍ−ｎ７２１は空状態になっている。
【００８２】
ここで、スレッドｍのプール管理部１０７は、ステップＳ７０４にて、プールｍ−ｎ７２１の末尾に使用済みノード７１１を追加する処理を行う。これは、ノード７１４のポインタ変数（後続のノードの場所を指す）に、使用済みノード７１１のポインタ情報を設定することで実現される。更に、ステップＳ７０５にて、末尾ノードへのポインタ変数７１５のポインタ情報にも、使用済みノード７１１のポインタ情報を設定する。
【００８３】
このように、担当スレッドＴ０がノード７１２からレコードを受け取る際に、パイプｍ−ｎ７２０から使用済みノード７１１が取り出され、取り出された使用済みノード７１１がプールｍ−ｎ７２１の末尾へ追加される。
【００８４】
ここで、図６と図８との比較により示されるように、「ノードを取り出す側のスレッドの役割」と「ノードを追加する側のスレッドの役割」とが、正反対になっている。
【００８５】
（８）パイプからのノードの取り出しと、取り出したノードのプールへの戻しの際の処理の流れ
引き続き、図８に示される処理の流れについて、図９を用いて説明する。図９は、図８に示される処理の流れを説明するためのフローチャートである。
【００８６】
図９に示されるように、まず、スレッドｍの実行制御部１０１が、自スレッドｍが管理するパイプ／プールｍ−ｎの組において未処理のノードがあるかどうかを判断する（ステップＳ６０１）。未処理のノードが無い場合、一連の処理は終了する。一方、未処理のノードがある場合、スレッドｍの実行制御部１０１が、パイプｍ−ｎの先頭ノードのポインタ変数が無効値であるか否かを判断する（ステップＳ６０２、取出判定ステップ）。ポインタ変数が無効値である場合、当該パイプｍ−ｎには処理すべきノードが設定されていないため、次の（すなわち、その他の）パイプ／プールｍ−ｎの処理へ進むため、ステップＳ６０１に戻る（取出生成ステップ）。一方、ポインタ変数が無効値でない場合（すなわち、未定義でない場合）、スレッドｍの実行制御部１０１が、先頭ノードのポインタ変数が指し示すノードに設定されているレコードを処理する（ステップＳ６０３）。
【００８７】
次に、スレッドmが、パイプｍ−ｎの先頭ノードを取り出し（ステップＳ６０４）、取り出した先頭ノードのポインタ変数に無効値を設定して（ステップＳ６０５、取出格納ステップ）、この先頭ノードをプールｍ−ｎの末尾に使用済みノードとして追加する（ステップＳ６０６、取出格納ステップ）。そして、ステップＳ６０２に戻る。
【００８８】
（９）ノードを末尾に追加するプールをラウンドロビンで選択する様子
引き続き、担当スレッドが、ノードを末尾に追加するプールを、ラウンドロビンで選択する様子について、図１０を用いて説明する。図１０は、一例として三つのスレッド間でレコードの送受信が行われる場合の、使用済みノードを末尾に追加するプールがラウンドロビンで選択される様子を説明するための説明図である。
【００８９】
なお、図８には、パイプｍ−ｎ７２０から生じた使用済みノードとしてのノード７１１をプールｍ−ｎ７２１へ追加する様子が記載されているが、ノードを末尾に追加するプールの選択方法は、これに限定されない。
【００９０】
図１０に示されるように、三つのスレッド間でレコードの送受信が行われる場合に、スレッドＴ０において、使用済みノードを末尾に追加するプールが、ラウンドロビンで選択される。より詳しくは、パイプＰ０−１から使用済みノードが生じると（ステップＳ８０１）、このパイプＰ０−１から生じた使用済みノードが、プールＱ０−１及びプールＱ０−２の中からラウンドロビン形式で選択されたプールに、追加される（ステップＳ８０２）。ラウンドロビン形式による、二つのプールからの選択とは、二つのプールから一回ずつ交互に選択される選択形式のことである。
【００９１】
なお、プールＱ０−１及びプールＱ０−２のそれぞれから見れば、スレッドＴ０は唯一の「ノードを追加する側の役割」を担うスレッドである。このため、このようにラウンドロビン形式でプールが選択される処理が行われても、処理が破綻することはない。
【００９２】
このようにする理由（このようにすることによる利点）は、以下の通りである。例えば図３に示されるように、今、スレッドＴ０が、ちょうどパイプ処理に入った直後であるとする。この時、パイプＰ０−１及びパイプＰ０−２には、スレッドＴ１及びスレッドＴ２から受け渡されたノードが設定されている一方、プールＱ０−１及びプールＱ０−２には、殆ど（又は、全く）空きノードが無い状況が考えられる。
【００９３】
この状況で、スレッドＴ０は、まず、パイプＰ０−１の処理を選択したとする（図４のステップＳ４０１）。仮に、パイプＰ０−１から生じた使用済みノードがプールＰ０−１にのみ追加される場合、スレッドＴ０がパイプＰ０−１の処理を終えるまでプールＰ０−２は空状態が続くことになり（図４のステップＳ４０１：ＮＯ）、その最中にスレッドＴ２がスレッドＴ０へノードを受け渡そうとすると、新しいノードが新規生成されることになる（図４のステップＳ４０３）。
【００９４】
この状況を改善するためには、パイプＰ０−１から生じた使用済みノードの一部を、プールＰ０−１でなくプールＰ０−２に戻すことが有効である。そのための典型的な手段として、図１０に示されるように、プールＰ０−１及びプールＰ０−２の中からラウンドロビン形式で、使用済みノードの追加先となるプールを選択する方法がある。これにより、上述のような状況で、スレッドＴ２が新しいノードを新規生成する機会を減らす効果が期待できる。
【００９５】
（１０）コンピュータをスレッド間通信システムとして機能させるためのスレッド間通信プログラム
引き続き、コンピュータをスレッド間通信システムとして機能させるためのスレッド間通信プログラムＰ１０について説明する。図１１は、スレッド間通信プログラムＰ１０のモジュール構成を示すブロック図である。図１１に示すように、スレッド間通信プログラムＰ１０は、実行制御モジュール１１、担当スレッド判断モジュール１２、データ入力部モジュール１３、データ処理モジュール１４、レコード転送モジュール１５、パイプ管理モジュール１６、プール管理モジュール１７、及び終了条件判断モジュール１８を備える。
【００９６】
これらモジュール１１〜１８が実行されることにより実現される機能は、上述したスレッド間通信システム１０において対応する実行制御部１０１、担当スレッド判断部１０２、データ入力部１０３、データ処理部１０４、レコード転送部１０５、パイプ管理部１０６、プール管理部１０７、及び終了条件判断部１０８の機能と同様である。
【００９７】
（１１）本発明による作用及び効果
本発明では、図３に示されるように、各スレッドには、他のスレッドの数に相当する数だけパイプが用意されており、各パイプは、互いに異なる他のスレッドの一つと対応付けられ、当該対応付けられたスレッドから送信されたレコードを格納順を指定してノードに格納することが可能である。そして、このスレッド間通信方法によれば、図６に示されるように、レコードの送信元である送信スレッドが、当該レコードを格納した新規ノード５１１を生成して、当該レコードの送信先である受信スレッドと対応するパイプｍ−ｎ５２１に追加する場合に、当該新規ノード５１１のポインタ変数に無効値を設定しつつ当該新規ノード５１１を当該パイプｍ−ｎ５２１の末尾に追加して格納する。次に、図８に示されるように、取り出しスレッドが、当該レコード７１１を対応するパイプｍ−ｎ７２０から取り出す場合に、当該パイプｍ−ｎ７２０の先頭ノード７１１のポインタ変数が無効値であるか否かを判定する。そして、当該ポインタ変数は無効値でないと判定された場合に、取り出しスレッドが、当該ポインタ変数が指す場所のノード７１２からレコードを取り出しつつ当該ノード７１２を新たな先頭ノードとして設定する。一方、当該ポインタ変数は無効値であると判定された場合に、取り出しスレッドが、対応するパイプｍ−ｎ７２０から取り出し可能なレコードを格納するノードは無い状態であると判断する。
【００９８】
これにより、各スレッドには他のスレッドの数に相当する数だけパイプが用意されており、送信スレッドが新規ノード５１１を生成して送信先のパイプｍ−ｎ５２１の末尾に追加して格納する。また、取り出しスレッドが、先頭ノード７１１のポインタ変数が無効値でない場合に当該ポインタ変数が指す場所のノード７１２からレコードを取り出す。一方、当該ポインタ変数は無効値である場合に、取り出し可能なレコードは無い状態であると判断される。このように、各スレッドには他のスレッドの数に相当する数だけパイプが用意された上で、送信スレッドによるパイプへのノードの格納と、取り出しスレッドによるパイプからのレコードの取り出しとが行われるため、ＣＡＳ操作を利用せずに、矛盾なく情報の受け渡しをすることが可能になり且つウェイトフリーになる。
【００９９】
また、図５に示されるように、各スレッドがレコードの入力を受け付けると、レコードを処理すべきスレッドが決定され、入力されたレコードは自スレッドで処理すべきと決定された場合に、各スレッドが自スレッドで処理する。一方、入力されたレコードは他のスレッドで処理すべきと決定された場合に、各スレッドが入力されたレコードを他のスレッドに送信する。
【０１００】
また、各スレッドには、各スレッドには、他のスレッドの数に相当する数だけプールが用意されており、各プールは、互いに異なる他のスレッドの一つと対応付けられ、レコードが取り出された使用済みノードを格納することが可能である。そして、この形態によれば、図８に示されるように、取り出しスレッドが、レコードが取り出された使用済みノード７１１のポインタ変数に無効値を設定しつつ（ステップＳ７０３）、当該使用済みノード７１１をプールｍ−ｎ７２１の末尾に追加して格納する。次に、図６に示されるように、レコードの送信元である送信スレッドが、当該レコードの送信先である受信スレッドと対応するプールｍ−ｎ５２０の先頭ノード５１１のポインタ変数が無効値であるか否かを判定する。そして、当該先頭ノード５１１のポインタ変数は無効値でないと判定された場合に、送信スレッドが、当該先頭ノード５１１を新規ノードとして再利用しつつ当該再利用するノード５１１のポインタ変数が指す場所のノード５１２を新たな先頭ノードとして設定する。一方、当該ポインタ変数は無効値であると判定された場合に、送信スレッドが、新規ノードを生成する。このように、使用済みノード７１１をプールｍ−ｎ７２１の末尾に追加・格納してノードを再利用することにより、新たなノードの生成を抑制して処理を効率化することが可能になる。
【０１０１】
また、図８に示されるように、取り出された使用済みノード７１１のポインタ変数に無効値が設定されつつ（ステップＳ７０３）、図１０に示されるように、当該使用済みノード７１１を末尾に追加するプールが複数のプールＱ０−１，Ｑ０−２の中からラウンドロビンで選択され、当該選択されたプールの末尾に当該使用済みノード７１１が追加される。このため、再利用可能なノードを、対応するプールに対して満遍なく供給することが可能になる。
【０１０２】
また、ロックフリー且つウェイトフリーにレコード（情報）の受け渡しをすることが可能になるため、並列に動作するスレッド間で互いの動作を妨げる要因は存在しないことになる。このため、目的の処理をより多くのスレッドに分割して行うほど、スレッド数に比例して処理性能を向上させることができる、という本発明の効果を発揮できる。
【０１０３】
また、本発明は、ＣＡＳ操作を用いないため、ＣＡＳ操作が利用できない環境（計算機および／またはプログラミング言語）においても、本発明を適用することができる。
【０１０４】
（１２）本発明の応用事例
本発明は、複数スレッドを用いる処理において、処理すべき各レコードの担当スレッドを所定の方法で決定できるような処理全般に対して、適用できる。典型的な具体例として、ハッシュテーブルの構築がある。図４に示されるように、ハッシュテーブルの要素となるキー／値のペアにおいて、例えばキーのハッシュ値のスレッド数によるｍｏｄｕｌｏを取得することで、担当スレッドを一意に決定することが可能になる。各スレッドは、自スレッドに対応するｍｏｄｕｌｏ値を持つレコードのみを集めてハッシュテーブルを構築すればよい。すなわち、スレッド数分だけ分割されたハッシュテーブルが、構築されることになる。
【０１０５】
ハッシュテーブルを構築した後に要素（レコード）を検索する際は、検索キーのハッシュ値のスレッド数（図４に示されるでは、「３」）によるｍｏｄｕｌｏから、まずは該当するハッシュテーブルを特定し（ハッシュテーブル０，１，２のいずれか）、次に、当該特定されたハッシュテーブルから通常の方法で検索を行えばよい。
【０１０６】
このようなハッシュテーブルに関する応用だけでも、様々な利用形態がある。例えば、「多数のキー／値の組からなる辞書テーブルを構築する」、「多数の値をそのままキーとして用い、ハッシュテーブル上でキーが衝突した回数から、各値の出現回数をカウントする」、「多数のキー／値の組から、同じキーを持つ値の集合を生成する」等が考えられる。このような応用事例に対して本発明を適用することで、処理をウェイトフリーな形態で並列化でき、処理を高速化できる。
【産業上の利用可能性】
【０１０７】
本発明によれば、スレッド間において、ＣＡＳ操作を利用せずに、矛盾なく情報の受け渡しをすることが可能でウェイトフリーなスレッド間通信方法、スレッド間通信システム、及びスレッド間通信プログラムを提供することができる。
【符号の説明】
【０１０８】
１０…スレッド間通信システム、１１…実行制御モジュール、１２…担当スレッド判断モジュール、１３…データ入力部モジュール、１４…データ処理モジュール、１５…レコード転送モジュール、１６…パイプ管理モジュール、１７…プール管理モジュール、１８…終了条件判断モジュール、１０１…実行制御部、１０２…担当スレッド判断部、１０３…データ入力部、１０４…データ処理部、１０５…レコード転送部、１０６…パイプ管理部、１０７…プール管理部、１０８…終了条件判断部、Ｄ０〜Ｄ２…入力データ、Ｈ０〜Ｈ２…ハッシュテーブル、Ｐ１０…スレッド間通信プログラム、Ｔ０〜Ｔ２…スレッド。
【図１】
2014222457.tif 000003
【図２】
2014222457.tif 000004
【図３】
2014222457.tif 000005
【図４】
2014222457.tif 000006
【図５】
2014222457.tif 000007
【図６】
2014222457.tif 000008
【図７】
2014222457.tif 000009
【図８】
2014222457.tif 000010
【図９】
2014222457.tif 000011
【図１０】
2014222457.tif 000012
【図１１】
2014222457.tif 000013