"入力データを供給する第一のスレッドから送信された制御信号を受信したのちに、前記入力データを使って演算を実行し、前記演算の結果を前記制御信号が指定するデータ領域に格納し、前記結果を使用する第二のスレッドへ前記制御信号を送信する、という一連の手順受信、演算、格納、送信を行う第三のスレッドを動作させる、ことを特徴とする、データ処理方法。前記第一のスレッドおよび前記第二のスレッドは、それぞれ別のスレッドであり、前記第一のスレッドが、当該第一のスレッドに入力データを供給するスレッドから送信された制御信号を受信したのちに、当該入力データを使って演算を実行し、当該演算の結果を前記第三のスレッドに供給する入力データとして当該制御信号が指定するデータ領域に格納し、前記第三のスレッドへ当該制御信号を送信する、という一連の手順受信、演算、格納、送信を行うか、又は、前記第二のスレッドが、前記第三のスレッドから送信された制御信号を受信したのちに、当該制御信号が指定するデータ領域に格納された演算の結果を入力データとして使って演算を実行し、当該演算の結果を当該制御信号が指定するデータ領域に格納し、当該結果を使用するスレッドへ当該制御信号を送信する、という一連の手順受信、演算、格納、送信を行う、ことを特徴とする、請求項1に記載のデータ処理方法。前記第三のスレッドは、前記制御信号の送信において、前記第二のスレッドが前記制御信号を受信するまで待ち合わせる、ことを特徴とする、請求項2に記載のデータ処理方法。前記第一のスレッドが前記第三のスレッドへ送信する前記制御信号の値を切り替えることによって、前記第三のスレッドが少なくとも二つのデータ領域へ演算結果を書き込むようにする、ことを特徴とする、請求項3に記載のデータ処理方法。データを記憶するためのデータ領域をもつ記憶手段と、入力データを供給する第一のスレッドから送信された制御信号を受信したのちに、前記入力データを使って演算を実行し、前記演算の結果を前記制御信号が指定するデータ領域に格納し、前記結果を使用する第二のスレッドへ前記制御信号を送信する、という一連の手順受信、演算、格納、送信を行う第三のスレッドを動作させる実行手段と、を備えることを特徴とする、データ処理装置。データを記憶するためのデータ領域をもつコンピュータを、入力データを供給する第一のスレッドから送信された制御信号を受信したのちに、前記入力データを使って演算を実行し、前記演算の結果を前記制御信号が指定するデータ領域に格納し、前記結果を使用する第二のスレッドへ前記制御信号を送信する、という一連の手順受信、演算、格納、送信を行う第三のスレッドを動作させる手段、として機能させることを特徴とする、データ処理プログラムが格納された非一時的なコンピュータ可読媒体。背景技術として説明したように、データ共有のためスレッド間通信やコピーを行うとデータ転送に時間がかかる、という課題がある。本発明の目的は、上述した課題を解決するために、データの依存関係を有するスレッドを実行する場合に、データをロック/アンロックすることなく、排他的なデータアクセスを保証でき、かつ、データ転送コストを削減することができるデータ処理方法、データ処理装置及びデータ処理プログラムが格納された非一時的なコンピュータ可読媒体を提供することにある。本発明の第1の態様にかかるデータ処理方法は、入力データを供給する第一のスレッドから送信された制御信号を受信したのちに、前記入力データを使って演算を実行し、前記演算の結果を前記制御信号が指定するデータ領域に格納し、前記結果を使用する第二のスレッドへ前記制御信号を送信する、という一連の手順受信、演算、格納、送信を行う第三のスレッドを動作させる、ことを特徴とするものである。本発明の第2の態様にかかるデータ処理装置は、データを記憶するためのデータ領域をもつ記憶部と、入力データを供給する第一のスレッドから送信された制御信号を受信したのちに、前記入力データを使って演算を実行し、前記演算の結果を前記制御信号が指定するデータ領域に格納し、前記結果を使用する第二のスレッドへ前記制御信号を送信する、という一連の手順受信、演算、格納、送信を行う第三のスレッドを動作させる実行部と、を備えることを特徴とするものである。本発明の第3の態様にかかるデータ処理プログラムが格納された非一時的なコンピュータ可読媒体は、データを記憶するためのデータ領域をもつコンピュータを、入力データを供給する第一のスレッドから送信された制御信号を受信したのちに、前記入力データを使って演算を実行し、前記演算の結果を前記制御信号が指定するデータ領域に格納し、前記結果を使用する第二のスレッドへ前記制御信号を送信する、という一連の手順受信、演算、格納、送信を行う第三のスレッドを動作させる手段、として機能させることを特徴とするものである。上述した本発明の各態様により、データの依存関係を有するスレッドを実行する場合に、データをロック/アンロックすることなく、排他的なデータアクセスを保証でき、かつ、データ転送コストを削減することができるデータ処理方法、データ処理装置及びデータ処理プログラムが格納された非一時的なコンピュータ可読媒体を提供することができる。まず、図1を参照して、本発明の実施の形態にかかるデータ処理装置1の概要について説明する。図1は、本発明の実施の形態にかかるデータ処理装置1の概要構成図である。データ処理装置5は、記憶部50及び実行部51を有する。記憶部50は、データが格納される複数の領域を含む。実行部51は、複数のスレッドを実行する。複数のスレッドはデータ依存関係をもつ。例えば、スレッド52の演算結果をスレッド53が使用する、という関係が存在する。このようなデータ依存関係にもとづいて、実行部51はスレッドの実行順序を決定する。続いて、本発明の実施の形態にかかるデータ処理装置5の処理について説明する。この説明では、データ依存関係をもつ二つのスレッドの一方を第1のスレッド、もう一方を第2のスレッド、と呼ぶことにする。この二つのスレッドは、第1のスレッドの演算結果を第2のスレッドが使用する、という関係をもつ。第1のスレッド52は、演算を行って、その演算結果となるデータを、記憶部50に含まれる複数の領域のうち、特定の領域に格納する。そして、第1のスレッド52は、記憶部50へのデータの格納を通知する格納通知情報と、記憶部50において、そのデータが格納された領域を示す格納領域情報と、を第2のスレッド53に送信する。第2のスレッド53は、第1のスレッドからの格納通知情報に応じて、第1のスレッド52からの格納領域情報が示す領域に格納されたデータを使用して演算を行う。続いて、本発明の実施の形態について図面を参照して詳細に説明する。まず、図2を参照して、本発明の実施の形態にかかるデータ処理装置1の構成について説明する。図2は、本発明の実施の形態にかかるデータ処理装置1の構成図である。データ処理装置1は、記憶ユニット10及びプロセッサ11~18を有する。なお、プロセッサ13~16については、図示を省略する。記憶ユニット10は、プロセッサ11~18を駆動するためのプログラムやプロセッサ11~18が使用する各種のデータを保持する記憶装置である。記憶ユニット10の実施形態は、例えば、メモリやハードディスクドライブ等である。記憶ユニット10は、記憶部50に対応する。プロセッサ11~18は、スレッドth1~th8を実行する。具体的には、プロセッサ1Nは、スレッドthNを実行する。プロセッサ11~18は、実行部51に対応する。図2ではひとつのプロセッサにひとつのスレッドが割り当てられているが、ひとつのプロセッサに複数のスレッドを割り当ててもよい。プロセッサ11~18はそれぞれ独立して動作するとともに、記憶ユニット10を介してデータを受け渡しする。本発明の模範的な実施形態における並列処理の概念を説明する。本実施形態は、並列処理の対象となるタスクをいくつかのサブタスクに分解し、サブタスクをスレッドに割り当て、スレッドを並列実行する。スレッドは、サブタスクを実行するプログラムである。本実施形態は、スレッドを並列実行する際に、スレッドの依存関係にもとづいて、実行順序を決定する。依存関係のないスレッドは並列に実行され、依存関係があるスレッドは依存関係にもとづいて順番に実行される。スレッドの依存関係は、スレッドに割り当てられたサブタスクの依存関係と等価である。そして、サブタスクの依存関係はサブタスクが扱うデータの依存関係と等価である。本実施形態は、サブタスクが使用するデータにもとづいてサブタスクの依存関係を決定する。例えば、サブタスクT1の演算結果R1をサブタスクT2が使用するなら、サブタスクT2はサブタスクT1に依存しており、サブタスクT2はサブタスクT1の後で実行されなければならない。こうしたデータフローにもとづいてサブタスクの依存関係が決定される。サブタスクの依存関係は、そのままスレッドの依存関係を表す。図3は、本実施形態におけるスレッドの並列実行の概念を表す図である。図3において、スレッドの実行順序はデータ依存関係を表すグラフ構造にもとづいて予め決定される。このグラフ構造は、スレッドが扱うデータの依存関係を表しており、複数のサブタスクで構成されたタスクのデータフローと同じ構造をもつ。つまり、タスクに含まれる複数のサブタスク間のデータの依存関係を表すグラフ構造は、それぞれのサブタスクを実行する複数のスレッド間のデータの依存関係を表すグラフ構造となる。図3のようなスレッド依存関係のグラフ構造から、各スレッドが使用するデータはどのスレッドの演算結果か、各スレッドの演算結果はどのスレッドに使われるか、がわかる。図3では、スレッドth1の演算結果をスレッドth2~th4が使用し、スレッドth2の演算結果をスレッドth5が使用し、スレッドth3の演算結果をスレッド6が使用し、スレッドth4~th5の演算結果をスレッドth7が使用し、スレッドth7の演算結果をスレッドth8が使用することを示している。図3において、二つのスレッドを結ぶ線はチャネルである。チャネルは、依存関係がある2つのスレッドの間の単方向のバッファレスのハンドシェイク型通信路である。図3において、スレッドth1からスレッドth4に矢印が向いている。これは、スレッドth1の演算結果をスレッドth4が使用すること、及び、スレッドth1からスレッドth4にシグナルが送信されること、を示している。また、ハンドシェイク型通信路は、送信側スレッドから送信された情報を受信側スレッドが受信したことを送信側スレッドが確認してから送信完了となる通信路である。本実施形態は、サブタスクの実行開始および終了をスレッドへ知らせるためにチャネルを使用する。スレッドは、サブタスクの実行が終わると、チャネルを通してシグナルを別のスレッドに送信する。シグナルは、スレッドからスレッドへ送信される情報である。シグナル送信はサブタスクの実行完了を他のスレッドへ通知する手段である。受信側スレッドがシグナルを受信することは、受信側スレッドがサブタスクの実行を開始して良いことを意味する。スレッド間でシグナルを送受信する際には、シグナルが受信側スレッドで受信されたことを送信側スレッドが確認できて始めて送信完了となる。つまり、スレッドは、他スレッドからシグナルを受けることによって処理を開始し、処理が終わると別スレッドへシグナルを送信する。シグナルは、スレッドに割り当てられたサブタスクが使用する記憶ユニット10のデータ領域番号を含んでいる。記憶ユニット10は、いくつかのデータ領域をもつ。各データ領域は、スレッドth1~th8のサブタスクの入出力データとなる複数のデータを格納する領域である。データは、変数や配列等である。そして、各データ領域は同じデータ構造をもっている。例えば、ひとつのデータ領域は、1つの構造体として定義される。また、複数のデータ領域は構造体の配列として定義される。その配列の要素番号がシグナルに含まれるデータ領域番号となる。サブタスクの入出力データは、記憶ユニット10の中の複数のデータ領域のうち、シグナルに含まれるデータ領域番号が示すデータ領域に配置される。スレッドは、サブタスクが必要とするデータをそのデータ領域から取得し、取得したデータを使用して演算を行う。スレッドは、サブタスクの演算結果をそのデータ領域へ書き込む。スレッドは、受信したシグナルに含まれるデータ領域番号を、別のスレッドへのシグナルに含めて送信する。したがって、図3の起点となるスレッドth1に与えられたシグナルのデータ領域番号が、他のスレッドth2~th8にも送信されることになる。そして、本実施形態は、後述するように、起点となるスレッドth1に与えるデータ領域番号を切り替えることによって、複数のデータ領域を使用して、パイプライン的にスレッドを並列動作させる。データ領域が少なくとも二つあれば、パイプライン的なスレッド並列動作が可能である。<スレッドの起動から終了まで>次に、図4を参照しながら、スレッドの起動から終了までの流れを説明する。プロセッサは、スレッドを作成し、起動する。起動されたスレッドをthNとする。以下、スレッドthNが実行する処理は、実際にはプロセッサによって実行される。スレッドthNは、依存関係がある別スレッドからシグナルを受信するまで待ち合わせる。スレッドthNが複数のスレッドに依存している場合には、それら全てのスレッドからシグナルを受信するまで待ち合わせる。スレッドthNが、依存する全てのスレッドからシグナルを受信したら、次のステップS300に進む。スレッドthNは、受信したシグナルのいずれかに終了コードが含まれているか否かを確認する。もし、終了コードが含まれているならば、スレッドthNはステップS600へ進む。そうでないならば、スレッドthNはステップS400へ進む。スレッドthNは、受信したシグナルからデータ領域番号Didxを読取り、番号Didxのデータ領域のデータを使用して、サブタスクを実行する。スレッドthNは、サブタスクの実行結果を、番号Didxのデータ領域に書き込む。サブタスクの実行が終わると、スレッドthNは、ステップS500に進む。スレッドthNは、スレッドthNの演算結果を使用する全てのスレッドへシグナルを送信する。つまり、スレッドthNは、依存関係がある他スレッドへシグナルを送信する。スレッドthNの演算結果を使用する全てのスレッドに対してシグナルを送信できたら、スレッドthNは、ステップS200へ戻る。ステップS200で受信したシグナルのいずれかに終了コードがふくまれている場合、スレッドthNは、実行を終了する。以降では、ステップS200のシグナル受信と、ステップS500のシグナル送信、について詳しく説明する。<シグナルの送受信>スレッドがシグナルをどのように送受信するかについて説明する。図4のステップS200においてスレッドはシグナルを受信する。図4のステップS500においてスレッドはシグナルを送信する。ステップS200およびS500のシグナル送受信において、受信側スレッドが受信可能な状態になっていることを確認してから送信側スレッドはシグナルを送信する。そして受信側スレッドがシグナルを受信したことを確認してから送信側スレッドはシグナル送信を完了する。これが、本実施形態におけるシグナル送受信の基本的な手順である。以降では、ステップS200およびS500のひとつの実現例として、ポーリングを使用したシグナル送受信について説明する。スレッドは、シグナルを送受信する際に、図5に示すチャネルのパラメータを使って、送受信の手順を制御する。チャネルのパラメータは以下の四つを含む。送信待機フラグシグナルを送信するスレッドが送信準備できているか否かを表すフラグである。フラグの値が0の場合は、送信側スレッドが送信準備できていないことを表す。フラグの値が1の場合は、送信側スレッドが送信準備できていることを表す。受信待機フラグシグナルを受信するスレッドが受信準備できているか否かを表すフラグである。フラグの値が0の場合は、受信側スレッドが受信準備できていないことを表す。フラグの値が1の場合は、受信側スレッドが受信準備できていることを表す。受信完了フラグシグナルを受信するスレッドがシグナルを受信したか否かを表すフラグである。フラグの値が0の場合は、受信側スレッドはシグナルを受信していないことを表す。フラグの値が1の場合は、受信側スレッドはシグナルを受信したことを表す。シグナルスレッドが送信する値である。値が-1のシグナルは、終了コードであり、これを受け取ったスレッドは終了することを表す。値が非負整数のシグナルは、スレッドが使用するべきデータ領域の番号を表す。チャネルのパラメータは記憶ユニット10に格納される。例えば、記憶ユニット10は、それぞれが各チャネルに対応する複数の領域を有する。複数の領域のそれぞれは、その領域に対応したチャネルのパラメータが格納される。スレッドは、後述するように、記憶ユニット10に格納されたチャネルのパラメータの変化に応じて、シグナルを送受信する。<ポーリングを使用したシグナル送信>図6を参照して、ポーリングを使用したシグナル送信の手順について説明する。以降の説明では、送信側スレッドをスレッドS、受信側スレッドをスレッドR、スレッドSからスレッドRへのチャネルをチャネルC、と呼ぶことにする。送信側スレッドSは、受信側スレッドRが受信待機中かどうかを調べる。チャネルCの受信待機フラグが1であれば、スレッドRが受信待機中であると判断できる。もし、スレッドRが受信待機中でなければ、スレッドSはステップS512へ進む。そして、スレッドSは、短時間待ち合わせた後で、再びステップS511へ戻る。つまり、スレッドSは、受信側スレッドRが受信待機中になるまで、ステップS511とステップS512を繰り返す。言い換えると、スレッドSは、スレッドSとスレッドRを関連付けるチャネルの受信待機フラグに1がセットされるまで、ポーリングをする。もし、ステップS511において、受信側スレッドRが受信待機中であれば、スレッドSは、ステップS513へ進む。スレッドSは、スレッドRへ送信したいシグナルをチャネルCに書き込む。スレッドSは、チャネルCの送信待機フラグに1をセットする。スレッドSは、受信側スレッドRが受信完了したかどうかを調べる。チャネルCの受信完了フラグが1であれば、スレッドRは受信完了したと判断できる。もし、スレッドRが受信完了していなければ、スレッドSはステップS516へ進む。そして、スレッドSは、短時間待ち合わせ後で、再びステップS515へ戻る。つまり、スレッドSは、受信側スレッドRが受信完了するまで、ステップS515とステップS516とを繰り返す。言い換えると、スレッドSは、スレッドSとスレッドRとを関連付けるチャネルの受信完了フラグに1がセットされるまで、ポーリングをする。もし、ステップS515において、受信側スレッドRが受信完了していれば、スレッドSは、ステップS517へ進む。スレッドSは、チャネルCの送信待機フラグを0にクリアする。以上のようにして、スレッドSは、チャネルCを使用して、スレッドRへシグナルを送信する。本実施形態においては、一対一で、スレッドSからスレッドRへシグナルを送信する。スレッドSが複数のスレッドへシグナルを送信する場合には、スレッドSは、上記の一対一のシグナル送信を複数回繰り返す。<ポーリングを使用したシグナル受信>図7を参照して、ポーリングを使用したシグナル受信の手順について説明する。以降の説明では、送信側スレッドをスレッドS、受信側スレッドをスレッドR、スレッドSからスレッドRへのチャネルをチャネルC、と呼ぶことにする。受信側スレッドRは、チャネルCの受信待機フラグに1をセットする。受信側スレッドRは、送信側スレッドSが送信待機中かどうかを調べる。チャネルCの送信待機フラグが1であれば、スレッドSは送信待機中であると判断できる。もし、スレッドSが送信待機中でなければ、スレッドRはステップS213へ進む。そして、スレッドRは、短時間待ち合わせた後で、再びステップS212へ戻る。つまり、スレッドRは、送信側スレッドSが送信待機状態になるまで、ステップS212とステップS213を繰り返す。言い換えると、スレッドRは、スレッドRとスレッドSを関連付けるチャネルの送信待機フラグに1がセットされるまで、ポーリングをする。もし、ステップS212において、送信側スレッドSが送信待機中であれば、スレッドRは、ステップS214へ進む。スレッドRは、チャネルCからシグナルを読取る。スレッドRは、チャネルCに受信完了フラグに1をセットする。スレッドRは、チャネルCの受信待機フラグを0にクリアする。スレッドRは、送信側スレッドSが依然として送信待機中かどうかを調べる。チャネルCの送信待機フラグが1であれば、スレッドSが送信待機中であると判断できる。もし、ステップS217において、送信側スレッドSが送信待機中であれば、スレッドRは、ステップS218へ進む。そして、スレッドRは、短時間待ち合わせた後で、再びステップS217へ戻る。つまり、スレッドRは、送信側スレッドSが送信待機中でなくなるまで、ステップS217とステップS218を繰り返す。言い換えると、スレッドRは、スレッドRとスレッドSを関連付けるチャネルの送信待機フラグが0にクリアされるまで、ポーリングをする。もし、ステップS217において、送信側スレッドSが送信待機中でなければ、スレッドRは、ステップS219へ進む。スレッドRがステップS215を実行した後に、スレッドRが受信完了したことを送信側スレッドSが知る。すると、スレッドSは、チャネルCの送信待機フラグを0にクリアする。これによって、スレッドRは、スレッドSが送信待機状態から抜けたことを知る。このようにして、スレッドRはステップS217を実行する。ステップS217で送信側スレッドSが送信待機中でない場合S217:No、スレッドRはチャネルCの受信完了フラグを0にクリアする。以上のようにして、スレッドRは、チャネルCを使用して、スレッドSからシグナルを受信する。本実施形態においては、一対一で、スレッドRはスレッドSからシグナルを受信する。スレッドRが複数のスレッドからシグナルを受信する場合には、スレッドRは、上記の一対一のシグナル受信を複数回繰り返す。以上のように、ステップS200およびS500の実現例として、ポーリングを使用したシグナル送受信を説明した。ステップS200およびS500の実現方法はこれに限らず、先に述べた本実施形態のシグナル送受信の基本的な考え方にもとづいていれば、ここで説明した以外の方法でも実現可能である。つまり、受信側スレッドが受信可能な状態になっていることを確認してから送信側スレッドがシグナルを送信し、受信側スレッドがシグナルを受信したことを確認してから送信側スレッドがシグナル送信を完了する、という考え方に基づいていれば、ここで説明した方法に限られない。<シグナル伝搬>図8を参照して、スレッドからスレッドへシグナルが伝搬しながら、スレッドに割り当てられたサブタスクが実行される様子を説明する。図8には、スレッドth1からth8までの8個のスレッドがある。それぞれのスレッドth1~th8には、サブタスクが割り当てられている。説明を簡単にするため、各サブタスクの処理時間は同じとする。8個のスレッドth1~th8のなかで、スレッドth1が起点となるスレッドであり、th8が終点となるスレッドである。図8には示されていないが、8個のスレッドの開始や終了を制御するために、もうひとつのスレッドが存在する。このスレッドをメインスレッドと呼ぶことにする。メインスレッドは、プロセッサ11~18のいずれかによって実行されるようにしてもよく、プロセッサ11~18以外の図示しないプロセッサによって実行されるようにしてもよい。メインスレッドと起点となるスレッドth1間及びメインスレッドと終点となるスレッドth8間のそれぞれにも、チャネルが存在する。メインスレッドは、スレッドth1~th8が使用するデータ領域とは別の記憶装置の領域を使用して、スレッドth1~th8と並列に動作する。まず、ステップ1において、起点となるスレッドth1へ、メインスレッドがシグナルを送信する。このとき、メインスレッドは、シグナルにデータ領域番号0を含めているものとする。スレッドth1はシグナルを受信して、データ領域番号0のデータ領域を使用してサブタスクを実行する。つまり、スレッドth1は、演算を行い、その演算結果を、データ領域番号0のデータ領域に格納する。つづいて、ステップ2において、スレッドth1は、自身が受信したシグナルのコピーをスレッドth2、th3、th4へ送信する。そのシグナルを受信したスレッドth2、th3、th4のそれぞれは、データ領域番号0のデータ領域を使用してそれぞれのサブタスクを実行する。つまり、スレッドth2~th4のそれぞれは、データ領域番号0のデータ領域に格納されるスレッドth1の演算結果を取得する。そして、スレッドth2~th4のそれぞれは、取得したデータを利用して演算を行い、その演算結果を、データ領域番号0のデータ領域に格納する。つづいて、ステップ3において、スレッドth2、th3、th4のそれぞれは、自身が受信したシグナルのコピーを、スレッドth5、th6、th7のそれぞれへ送信する。そして、そのシグナルを受信したスレッドth5、th6のそれぞれは、データ領域番号0のデータ領域を使用してそれぞれのサブタスクを実行する。つまり、スレッドth5は、データ領域番号0のデータ領域に格納されるスレッドth2の演算結果を取得する。そして、スレッドth5は、取得したデータを利用して演算を行い、その演算結果を、データ領域番号0のデータ領域に格納する。また、スレッドth6は、データ領域番号0のデータ領域に格納されるスレッドth3の演算結果を取得する。そして、スレッドth6は、取得したデータを利用して演算を行い、その演算結果を、データ領域番号0のデータ領域に格納する。一方、スレッドth7は、スレッドth4だけではなくスレッドth5、th6のシグナルも受信する必要があるため、スレッドth5、th6のシグナルを待ち続ける。つづいて、ステップ4において、スレッドth5、th6のそれぞれは、自身が受信したシグナルのコピーをともにスレッドth7へ送信する。そして、そのシグナルを受信したスレッドth7は、依存しているスレッドth4、th5、th6からのシグナルを全て受信できたことになるので、データ領域番号0のデータ領域を使用してサブタスクの実行を開始する。つまり、スレッドth7は、データ領域番号0のデータ領域に格納されるスレッドth4~th6の演算結果を取得する。そして、スレッドth7は、取得したデータを利用して演算を行い、その演算結果を、データ領域番号0のデータ領域に格納する。つづいて、ステップ5において、スレッドth7は自身が受信したシグナルのコピーをスレッドth8へ送信する。そして、そのシグナルを受信したスレッドth8は、番号0のデータ領域を使用してサブタスクの実行を開始する。つまり、スレッドth8は、データ領域番号0のデータ領域に格納されるスレッドth7の演算結果を取得する。そして、スレッドth8は、取得したデータを利用して演算を行い、その演算結果を、データ領域番号0のデータ領域に格納する。やがて、そのサブタスクが実行完了し、スレッドth8は自身が受信したシグナルのコピーをメインスレッドへ送信する。メインスレッドは、終点スレッドであるスレッドth8からのシグナルを受信することによって、全てのサブタスクが実行完了したことを知る。図8の例では、各サブタスクの実行時間は同じだと仮定して説明したが、一般にはサブタスクの実行時間は異なる。サブタスクの実行時間が異なると、複数のスレッドからのシグナルを受信するスレッドにおいて、シグナルの受信時刻にズレが生じる。しかし、本実施形態においては、ハンドシェイク型のシグナル送受信を使うことによって、そのズレを許容することができる。ハンドシェイク型のシグナル送受信においては、受信側スレッドが受信可能な状態になっていることを確認してから送信側スレッドがシグナルを送信し、受信側スレッドがシグナルを受信したことを確認してから送信側スレッドがシグナル送信を完了する、という考え方に基づいている。つまり、シグナル送受信の手順の中に待ち合わせが含まれている。したがって、サブタスクの実行時間やシグナル受信時間が異なったとしても、その違いを許容できるのである。<パイプライン的並列動作>図9A、9B、9Cを参照して、本実施形態が、パイプライン的にスレッドを並列動作させることができること、説明する。図9A、9B、9Cは、図8と同じ8個のスレッドがパイプライン的に並列動作する様子を表した図である。図9A、9B、9Cにおいて、各スレッドを並列に動作させるために、シグナルを使用して、各スレッドに使わせるデータ領域を交互に切り替えていく。以下の説明において、データ領域を切り替える様子を説明する。まず、図9Aのステップ1から4を説明する。ステップ1において、メインスレッドは、起点となるスレッドth1へシグナルを送信する。このとき、メインスレッドは、シグナルにデータ領域番号0を含めているものとする。スレッドth1はシグナルを受信して、データ領域番号0のデータ領域を使用してサブタスクを実行する。つづいて、ステップ2において、スレッドth1はシグナルをスレッドth2、th3、th4へそれぞれ送信する。スレッドth2、th3、th4のそれぞれは、データ領域番号0のデータ領域を使用してそれぞれのサブタスクを実行する。さらに、メインスレッドは、データ領域番号を0から1に切り替えたシグナルをスレッドth1へ送信する。スレッドth1はそのシグナルを受信して、データ領域番号1のデータ領域を使用してサブタスクを実行する。つづいて、ステップ3において、スレッドth2、th3、th4のそれぞれは、シグナルをスレッドth5、th6、th7のそれぞれへ送信する。そして、スレッドth5、th6のそれぞれは、データ領域番号0のデータ領域を使用してそれぞれのサブタスクを実行する。一方、スレッドth7は、スレッドth5、th6からのシグナルを待ち続ける。さらに、スレッドth1はシグナルをスレッドth2、th3、th4へ送信する。スレッドth2、th3、th4のそれぞれは、データ領域番号1のデータ領域を使用してそれぞれのサブタスクを実行する。さらに、メインスレッドはシグナルをスレッドth1へ送信する。スレッドth1は、データ領域番号0のデータ領域を使用してサブタスクを実行する。つづいて、ステップ4において、スレッドth5、th6のそれぞれは、シグナルをスレッドth7へ送信する。そして、スレッドth7は、必要なシグナルがそろったので、データ領域番号0のデータ領域を使用してサブタスクを実行する。さらに、スレッドth2、th3、th5、th6は、シグナルの送信、シグナルの受信、サブタスク実行、をそれぞれ行う。スレッドth5、th6のそれぞれは、シグナルを受信してサブタスクを実行する。また、スレッドth2、th3のそれぞれは、シグナルを受信してサブタスクを実行する。スレッドth4は、スレッドth7がまだデータ領域番号0のデータ領域を使用したサブタスクを実行しているところなので、新たなシグナルをスレッドth7に送信することができず、待ち合わせ状態にある。つまり、スレッドth7は、スレッドth4とスレッドth7を関連付けるチャネルの受信待機フラグを0にしたままとする。スレッドth7がデータ領域番号0のデータ領域を使用したサブタスクの実行を完了し、新たなシグナルを受信可能な状態になれば、スレッドth4はシグナルをスレッドth7に送信可能になる。また、スレッドth1は、スレッドth4が待ち合わせ状態にあるため、シグナルをスレッドth4に送信することができない。つまり、スレッドth4は、スレッドth1とスレッドth4を関連付けるチャネルの受信待機フラグを0にしたままとする。また、スレッドth1は、スレッドth1とスレッドth4を関連付けるチャネルの受信待機フラグが1にセットされるまで待つ。そのため、スレッドth1は、メインスレッドとスレッドth1を関連付けるチャネルの受信待機フラグを0にしたままとなる。つづいて、図9Bのステップ5から8を説明する。ステップ5において、スレッドth7は、データ領域番号0のデータ領域を使用したサブタスクの実行が完了するので、新たなシグナルを受信してサブタスクを実行できるようになる。よって、スレッドth7は、スレッドth4~th6のそれぞれと、スレッドth7とを関連付けるチャネルのそれぞれにおける受信待機フラグを1にする。そして、スレッドth7は、スレッドth4~th6から、シグナルを受信してサブタスクを実行する。これによって、スレッドth4は、待ち合わせ状態が解除される。スレッドth8は、スレッド7から、シグナルを受信してサブタスクを実行する。一方、ステップ4において待ち状態にあったスレッドth4は、ステップ5において、待ち合わせ状態が解除されるため、スレッドth1とスレッドth4を関連付けるチャネルの受信待機フラグを1にする。そして、スレッドth4は、スレッドth1からシグナルを受信し、サブタスクを実行する。そして、スレッドth1は、スレッドth4がシグナルを受信するまで待ち合わせてから、メインスレッドからシグナルを受信して、サブタスクを実行する。スレッドth2、th3のそれぞれは、スレッドth1から新たなシグナルが送信されるのを待つ。スレッドth5、th6のそれぞれは、スレッドth2、th3のそれぞれから、シグナルを受信してサブタスクを実行する。つづいて、ステップ6において、スレッドth1、th2、th3、th4、th7、th8のそれぞれは、シグナルの送信、シグナルの受信、サブタスク実行、をそれぞれ行う。スレッドth1に対しては、メインスレッドがシグナルを送信する。スレッドth1、th7のそれぞれは、データ領域番号0のシグナルを受信してサブタスクを実行する。スレッドth2、th3、th4、th8のそれぞれは、データ領域番号1のシグナルを受信してサブタスクを実行する。一方、スレッドth5はスレッドth2から、新たなシグナルが送信されるのを待ち、スレッドth6はスレッドth3から、新たなシグナルが送信されるのを待つ。つづいて、ステップ7において、スレッドth7以外のスレッドは、シグナルの送信、シグナルの受信、サブタスク実行、をそれぞれ行う。つまり、スレッドth1、th5、th6のそれぞれは、シグナルを受信してサブタスクを実行する。また、スレッドth2、th3、th4、th8のそれぞれは、データ領域番号0のシグナルを受信してサブタスクを実行する。スレッドth1に対しては、メインスレッドがシグナルを送信する。一方、スレッドth7は、スレッドth4からシグナルを受信しているものの、スレッドth5、th6からシグナルを受信できるまで待つ。つづいて、ステップ8において、スレッドth1、th4、th8以外のスレッドは、シグナルの送信、シグナルの受信、サブタスク実行、をそれぞれ行う。つまり、スレッドth5、th6のそれぞれは、シグナルを受信してサブタスクを実行する。また、スレッドth2、th3、th7のそれぞれは、シグナルを受信してサブタスクを実行する。スレッドth1に対しては、メインスレッドがシグナルを送信する。一方、スレッドth8は、スレッドth7から新たなシグナルが送信されるのを待ち、スレッドth1、th4は、ステップ4と同じような状態にある。つまり、スレッドth4が直前に送信したシグナルを使用してスレッドth7がサブタスクを実行中なので、スレッドth4はスレッドth7に新たなシグナルを送信できず、待ち合わせ状態にある。また、スレッドth1もスレッドth4にシグナルを送信することができない。スレッドth7がシグナルを使用したサブタスクを実行完了すれば、スレッドth4はシグナルをスレッドth7に送信可能になる。つづいて、図9Cのステップ9から12を説明する。ステップ9において、スレッドth7は新たなシグナルデータ領域番号0を受信してサブタスクを実行する。スレッドth8は、シグナルデータ領域番号1を受信してサブタスクを実行する。一方、ステップ8において待ち状態にあったスレッドth4は、ステップ9においてスレッドth1からシグナルデータ領域番号1を受信し、サブタスクを実行する。そして、スレッドth1は、スレッドth4がシグナルデータ領域番号1を受信するまで待ち合わせてから、スメインスレッドからシグナルデータ領域番号0を受信して、サブタスクを実行する。その間、スレッドth2、th3のそれぞれは、スレッドth1から新たなシグナルデータ領域番号0が送信されるのを待つ。スレッドth5、th6のそれぞれは、シグナルを受信してサブタスクを実行する。ステップ9は、ステップ5においてシグナルの番号を入れ替えたものである0を1へ、1を0へ。同様の関係は、ステップ10とステップ6、ステップ11とステップ7、ステップ12とステップ8、のそれぞれに当てはまる。ステップ12の次は、ステップ5にもどって、動作を繰り返す。そのため、ステップ10以降については、詳細な説明は省略する。以上述べたように、本実施形態を使うことにより、複数のスレッドをパイプライン的に並列動作させることができる。以上説明したように,本発明を使用すれば、共有メモリ環境において、複数のスレッドが共有メモリ上のデータを共有し、メッセージパッシングによってスレッド間で直接データを転送することなく、複数のスレッドをパイプライン的に並列動作させることができる。本発明は、組込み向けのマルチプロセッサから汎用のマルチコアPCなど、共有メモリ環境で複数のスレッドが動作するような計算機で幅広く応用可能である。以上に説明したように、本実施の形態では、演算を行う第1のスレッドと、第1のスレッドの演算結果を使用して演算を行う第2のスレッドと、を実行する場合に、第1のスレッドが、演算を行って演算結果を示すデータを記憶ユニット10に含まれる複数のデータ領域のうち、特定のデータ領域に格納するようにしている。次に、第1のスレッドが、記憶ユニット10へのデータの格納を通知するシグナルを第2のスレッドに送信するようにしている。そして、第2のスレッドが第1のスレッドからのシグナルに応じて、シグナルに含まれるデータ領域番号が示すデータ領域に格納されたデータを使用して演算を行うようにしている。これによれば、第1のスレッドが記憶ユニット10にデータを格納した後に、第2のスレッドが記憶ユニット10に格納されたそのデータを使用することになるため、第1のスレッドと第2のスレッドから、記憶ユニット10のデータへのアクセスが競合することがなくなる。そのため、ロック/アンロックをすることなく、排他的なデータアクセスを保証できる。また、第1のスレッドから第2のスレッドに、データが格納されたデータ領域を示す情報のみを送信するだけで、第2のスレッドが第1のスレッドの演算結果を取得することができる。つまり、演算結果を示すデータそのものを送信する必要がなくなる。そのため、データ転送コストを削減することができる。また、本実施の形態では、さらに、あるステップで、第1のスレッドが、演算を行って演算結果を示すデータを、記憶ユニット10に含まれるデータ領域0に格納するようにしている。そして、次のステップで、第1のスレッドが、演算を行って演算結果を示すデータを、データ領域0とは異なるデータ領域1に格納するとともに、第2のスレッドが、第1のスレッドからのシグナルが示すデータ領域0に格納されたデータを使用して演算を行っている。これによれば、第2のスレッドによるデータ領域0のデータの使用と、第1のスレッドによるがデータ領域0のデータの更新とが競合することがない。そのため、スレッドをパイプライン的に並列動作させることが可能となる。なお、データ領域0とデータ領域1が逆であっても同様となる。以上、実施の形態を参照して本願発明を説明したが、本願発明は上記によって限定されるものではない。本願発明の構成や詳細には、発明のスコープ内で当業者が理解し得る様々な変更をすることができる。本実施の形態では、スレッドが演算結果を示すデータが格納されたデータ領域を示すデータ領域番号をシグナルに含めて送信し、そのスレッドに依存するスレッドがシグナルの受信に応じて、シグナルに含まれるデータ領域番号のデータ領域に格納されたデータを利用するようにしているが、これに限られない。つまり、本実施の形態では、データ領域にデータを格納したことを通知する情報に、データが格納された領域を示す情報を含めて送信しているが、それらの情報を1つの情報として送信するようにしなくてもよい。本実施の形態では、メインスレッドが、データ領域番号0のシグナルとデータ領域番号1のシグナルを交互に送信する場合について例示したが、これに限られない。例えば、記憶ユニット10がデータ領域番号を3つ以上有するようにして、2よりも大きいデータ領域番号のシグナルを送信するようにしてもよい。また、本実施の形態では、メインスレッドが、送信するシグナルのデータ領域番号をサイクリックに切り替える場合について例示したが、これに限られない。メインスレッドは、複数のスレッドによる同一のデータの使用及び更新が競合しなければ、データ領域番号をどのように切り替えるようにしてもよい。本実施の形態では、1つのプロセッサが1つのスレッドを実行する場合について例示したが、これに限られない。例えば、1つのプロセッサが複数のスレッドを実行するようにしてもよい。つまり、複数のスレッドを1以上の任意の数のプロセッサで実行するようにしてもよい。以上に説明した本発明にかかるデータ処理装置は、上述の実施の形態の機能を実現するプログラムを、コンピュータ又はコンピュータが有するCPU、MPU等のプロセッサが実行することによって、構成することが可能である。また、このプログラムは、様々なタイプの非一時的なコンピュータ可読媒体を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体、光磁気記録媒体、CD-ROMもしくはアプリケーションソフトウェアと共同して、上述の実施の形態の機能を実現する場合も、本発明の実施の形態に含まれる。さらに、このプログラムの処理の全てもしくは一部がコンピュータに挿入された機能拡張ボードや、コンピュータに接続された機能拡張ユニットによって行われて、上述の実施の形態の機能が実現される場合も、本発明の実施の形態に含まれる。上記の実施形態の一部又は全部は、以下の付記のようにも記載されうるが、以下には限られない。演算を行う第1のスレッドと、前記第1のスレッドの演算結果を使用して演算を行う第2のスレッドと、を実行するデータ処理方法であって、前記第1のスレッドが、演算を行って当該演算結果を示すデータを、前記記憶部に含まれる複数の領域のうち、特定の領域に格納する第1の演算ステップと、前記第1のスレッドが、前記記憶部へのデータの格納を通知する格納通知情報と、前記記憶部において当該データが格納された領域を示す格納領域情報と、を前記第2のスレッドに送信する送信ステップと、前記第2のスレッドが、前記第1のスレッドからの格納通知情報に応じて、前記第1のスレッドからの格納領域情報が示す領域に格納されたデータを使用して演算を行う第2の演算ステップと、を備えたデータ処理方法。前記第1の演算ステップでは、前記第1のスレッドが、第1の演算を行って当該第1の演算結果を示す第1のデータを、前記記憶部に含まれる第1の領域に格納し、前記第2の演算ステップでは、前記第1のスレッドが、第2の演算を行って当該第2の演算結果を示す第2のデータを、前記記憶部に含まれ、前記第1の領域とは異なる第2の領域に格納するとともに、前記第2のスレッドが、前記第1のスレッドからの格納領域情報が示す第1の領域に格納された第1のデータを使用して演算を行う付記1に記載のデータ処理方法。前記データ処理方法は、さらにメインスレッドを実行するデータ処理方法であって、前記メインスレッドが、前記第1の領域を示す格納領域情報を前記第1のスレッドに送信するステップをさらに備え、前記第1の演算ステップでは、前記第1のスレッドが、前記第1のデータを、前記メインスレッドからの格納領域情報が示す第1の領域に格納し、前記送信ステップでは、前記メインスレッドが、前記第2の領域を示す格納領域情報を前記第1のスレッドに送信し、前記第2の演算ステップでは、前記第1のスレッドが、前記第2のデータを、前記メインスレッドからの格納領域情報が示す第2の領域に格納する付記2に記載のデータ処理方法。前記データ処理方法は、前記第1のスレッドを複数実行し、前記第2のスレッドは、前記複数の第1のスレッドによる複数の演算結果を使用して演算を行い、前記送信ステップは、前記第1のスレッドが、前記格納通知情報及び前記格納領域情報を第2のスレッドに送信する場合に、当該格納通知情報及び当該格納領域情報を送信することを示す送信実行情報を、当該第1のスレッドに対応する送受信情報記憶部に格納するステップと、前記第2のスレッドが、前記送受信情報記憶部に送信実行情報が格納された場合に、当該送受信情報記憶部に対応する第1のスレッドからの前記格納通知情報及び前記格納領域情報を受信するステップと、を含み、前記第2の演算ステップでは、前記第2のスレッドが、前記複数の第1のスレッドからの格納通知情報を全て受信した場合に、前記第1のスレッドからの格納領域情報が示す領域に格納されたデータを使用して演算を行う付記1乃至3のいずれか1項に記載のデータ処理方法。前記送信実行情報を格納するステップでは、前記第1のスレッドが、前記格納通知情報及び前記格納領域情報を送受信情報記憶部に格納して、前記送信実行情報を前記送受信情報記憶部に格納し、前記格納領域情報を受信するステップでは、前記第2のスレッドが、前記送受信情報記憶部に送信実行情報が格納された場合に、前記送受信情報記憶部に格納された前記格納通知情報及び前記格納領域情報を取得する付記4に記載のデータ処理方法。前記記憶部に含まれる領域は、それぞれに前記データが格納され、第1のデータ格納領域及び第2のデータ格納領域を含む複数のデータ格納領域を含み、前記第1の演算ステップでは、前記第1のスレッドが、前記データを、前記特定の領域に含まれる第1のデータ格納領域に格納し、前記第2の演算ステップでは、前記第2のスレッドが、前記演算結果を示すデータを、前記第1のスレッドからの格納領域情報が示す領域に含まれる第2のデータ格納領域に格納する付記1乃至5のいずれか1項に記載のデータ処理方法。前記格納通知情報は、前記格納領域情報を含む付記1乃至6のいずれか1項に記載のデータ処理方法。前記第1のスレッド及び前記第2のスレッドは、1以上のプロセッサによって実行される付記1乃至7のいずれか1項に記載のデータ処理方法。データが格納される複数の領域を含む記憶部と、演算を行う第1のスレッドと、前記第1のスレッドの演算結果を使用して演算を行う第2のスレッドと、を実行する実行部と、を備え、前記第1のスレッドは、演算を行って当該演算結果を示すデータを、前記記憶部に含まれる複数の領域のうち、特定の領域に格納し、前記記憶部へのデータの格納を通知する格納通知情報と、前記記憶部において当該データが格納された領域を示す格納領域情報と、を前記第2のスレッドに送信し、前記第2のスレッドは、前記第1のスレッドからの格納通知情報に応じて、前記第1のスレッドからの格納領域情報が示す領域に格納されたデータを使用して演算を行うデータ処理装置。演算を行う第1のスレッドと、前記第1のスレッドの演算結果を使用して演算を行う第2のスレッドと、を実行するデータ処理方法であって、前記第1のスレッドが、演算を行って当該演算結果を示すデータを、前記記憶部に含まれる複数の領域のうち、特定の領域に格納する第1の演算ステップと、前記第1のスレッドが、前記記憶部へのデータの格納を通知する格納通知情報と、前記記憶部において当該データが格納された領域を示す格納領域情報と、を前記第2のスレッドに送信する送信ステップと、前記第2のスレッドが、前記第1のスレッドからの格納通知情報に応じて、前記第1のスレッドからの格納領域情報が示す領域に格納されたデータを使用して演算を行う第2の演算ステップと、をプロセッサに実行させるデータ処理プログラム。この出願は、2010年10月12日に出願された日本出願特願2010-229784を基礎とする優先権を主張し、その開示の全てをここに取り込む。"