(57)【要約】【課題】複数のプロセス、処理スレッド間の同期をとるためのメッセージを並行して送受信し、オブジェクト管理の処理中に受信したメッセージを先読みしてメッセージの処理時間を短縮し、また送信側と受信側でＮ対Ｎの同期を可能にする。【解決手段】メッセージの送受信スレッド、受信メッセージキュー、送信メッセージキュー、未処理メッセージキュー、オブジェクトを登録管理するオブジェクト管理手段、受信メッセージが同期型メッセージの場合は優先して登録し該当処理を実行させる返信メッセージを送信し、非同期型メッセージの場合、シグナル状態の時には登録処理し、また非シグナル状態の時には未処理メッセージキューに格納し、受信メッセージキューに同期型メッセージがない場合には待機中の非同期型メッセージの登録処理をするメッセージ処理スレッドとを備える。【選択図】　　　　図１
2004030312.tif 000002
【特許請求の範囲】
【請求項１】
一連の処理を分担して並列処理する複数のプロセスまたは複数の処理スレッド間の同期制御を行うマルチスレッド同期制御方式において、
前記複数のプロセスまたは複数の処理スレッド間の同期をとるメッセージを前記複数のプロセスまたは複数の処理スレッドと送受信する送受信スレッドと、
前記送受信スレッドが受信した前記メッセージを順次格納する受信メッセージキュー、前記複数のプロセスまたは複数の処理スレッドに送信する返信メッセージを格納する送信メッセージキューおよび受信時に読み飛ばしたメッセージを格納し待機させる未処理メッセージキューを有するメッセージキュー手段と、
前記複数のプロセスまたは複数の処理スレッドにおける各処理状態を通知するオブジェクトを登録し管理するためのオブジェクト管理手段と、
前記受信メッセージキューに格納された受信メッセージが同期型メッセージの場合、当該同期型メッセージを優先し当該メッセージの処理対象となるオブジェクトを前記オブジェクト管理手段で参照して登録すると共に、前記複数のプロセスまたは複数の処理スレッドの該当する処理を実行させる返信メッセージを前記送信メッセージキューに格納し、
一方、前記受信メッセージキューに格納されたメッセージが非同期型メッセージの場合、前記オブジェクト管理手段の当該メッセージの処理対象となるオブジェクトがシグナル状態の時には当該メッセージを処理し、また非シグナル状態の時には当該非同期型メッセージを前記未処理メッセージキューに格納し、
前記受信メッセージキューに同期型メッセージがない場合には前記未処理メッセージキューに格納した待機中の非同期型メッセージについて処理するメッセージ処理スレッドと
を備えたことを特徴とするマルチスレッド同期制御方式。
【請求項２】
メッセージ処理スレッドは、受信メッセージキューに格納された受信メッセージが非同期型メッセージの場合、当該非同期型メッセージのうちから特定のメッセージのみを判定した後、当該メッセージの処理対象となるオブジェクトをオブジェクト管理手段でシグナル状態か調べて未処理メッセージキューに格納する対象とするようにしたことを特徴とする請求項１記載のマルチスレッド同期制御方式。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
この発明は複数のプロセスまたはスレッドが同期をとりながら、一連の処理を分担して並列に実行する並列処理システムにおけるマルチスレッド同期制御方式に関するものである。
【０００２】
【従来の技術】
並列処理とは、複数のプロセッサを搭載したマシンにおいて、１つの処理を複数のプロセスまたはスレッドで分担して同時に処理することで、高速化を実現する処理方法である。このような並列処理においては、各スレッド間でメッセージを用いて同期を取る必要がある。従来の同期化方式示す技術として、特開平５−３０３５０３号公報「同期化メッセージ通信装置」がある。
【０００３】
図１９は上記公報の同期化方式の構成を示すブロック図である。図において、１は記憶部で、受信タスク識別子と送信タスク識別子との組である送受信情報を複数記憶する手段である。２は待ち部で、タスク再開ポイントを指定して自タスクをタスク待ち状態へ移行する手段である。３は実行部で、タスクの実行を行う手段である。４は受信部で、タスクを指定してメッセージの受信を行う手段である。５は送信部で、自タスク識別子を送信タスク識別子とし、送信先タスクの識別子を受信タスク識別子として作成した送受信情報を記憶部１に記憶させた後にメッセージを送信する手段である。６は解除部で、記憶部１から自タスク識別子を含む送受信情報をすべて削除する手段である。７は全受信部で、記憶部１から受信タスク識別子が自タスク識別子と等しい送受信情報から送信タスク識別子を全て取り出した後、個々の送信タスク識別子に対応する分だけ受信部４を呼出す手段である。８は全実行部で、記憶部１から受信タスク識別子が自タスク識別子と等しい送受信情報から送信タスク識別子を全て取り出した後、個々の送信タスク識別子に対応する分だけ実行部３を呼出す手段である。９は全送信部で、記憶部１から受信タスク識別子が自タスク識別子と等しい送受信情報から送信タスク識別子を全て取り出した後、個々の送信タスク識別子に対応する分だけ送信部５を呼出した後、待ち部２を呼出す手段である。１０は判定部で、自タスクが受信タスク状態であれば、全実行部８を呼出した後に、全送信部９を呼出す手段である。
【０００４】
次に動作について説明するが、始めに送信側のタスクの動作を説明する。
今、判定部１０が送信タスク状態となっているとすると、まず、送信部５は、送信タスクの要求を受けて受信タスクにメッセージを送信し、記憶部１へ送受信情報を設定し、タスク再開ポイントとして全受信部７に渡して待ち部２を起動する。これにより、待ち部２は、全受信部７をタスク再開ポイントとして、タスク待ち状態に移行する。次に、全受信部７が起動され、メッセージを受信した後に記憶部１を起動する。次に、判定部１０は、状態変数が送信タスク状態であるため実行を終了する。
【０００５】
次に、受信タスク側としての動作を説明する。
今、判定部１０の状態変数は受信タスク状態となっている。まず、全受信部７は、記憶部１の中で自タスクの識別子と等しい受信タスク識別子を持つ送受信情報から送信タスク識別子を取り出し、それらに対応する全ての送信タスクに対して送信タスク毎に受信部４を起動する。これにより、受信部４は指定された送信タスクからメッセージを受信する。この動作は、送信タスクの数だけ繰り返される。
【０００６】
次に、全受信部７は判定部１０を起動する。判定部７は、状態変数が受信タスク状態であるため全実行部８を起動する。これにより、全実行部８は、記憶部１の中で、自タスク識別子と等しい受信タスク識別子を持つ送受信情報から送信タスク識別子を取り出し、それらに対応する全ての送信タスクに対して送信タスク毎に実行部３を起動する。これにより実行部３は、受信タスクを実行する。この動作は、送信タスクの数だけ繰り返される。次に、判定部１０は全送信部９を起動する。全送信部９は、記憶部１の中で、自タスク識別子と等しい受信タスク識別子を持つ送受信情報から送信タスク識別子を取り出し、それらに対応する全ての送信タスクに対して送信タスク毎に送信部５を起動する。これにより、送信部５は送信タスクへの返信を行う。この動作は、送信タスクだけ繰り返される。次に、全送信部９は解除部６を起動し、解除部６は記憶部１から自タスクの識別子を含む送受信情報を削除する。次に、全送信部９は待ち部２を起動する。待ち部２は、全受信部７をタスク再開ポイントとして、タスク待ち状態へ移行する。
【０００７】
【発明が解決しようとする課題】
従来の同期化方式は以上のように構成されているので、受信メッセージを同時に取り出して、全メッセージについて同時にまとめて処理を行うことで性能向上を図っている。しかし、送受信を行うスレッドと処理を行うスレッドが同じであるために、メッセージ処理中に送られてきたメッセージを同時に処理することができず、性能面で問題があった。また、従来の同期化方式の装置では、ディスパッチの回数を削減してオーバーヘッドを削減するものであり、メッセージ処理そのものの時間を短縮するために先読みを行うわけではない。さらに、１つのメッセージは、送信側と受信側で１対１の通信にしか適用できないため、複数のスレッド間でスレッドの実行順序を決める場合には適用できないなどの課題があった。
【０００８】
この発明は上記のような課題を解決するためになされたもので、複数のプロセスまたは複数の処理スレッド間の同期をとるためのメッセージを並行して送受信し、オブジェクト管理手段で、メッセージの処理対象となるオブジェクトの参照・登録中に受信したメッセージを先読みすることでメッセージの処理時間そのものを短縮し、また送信側と受信側でＮ対Ｎの同期を可能にするマルチスレッド同期制御方式を得ることを目的とする。
【０００９】
【課題を解決するための手段】
この発明に係るマルチスレッド同期制御方式は、一連の処理を分担して並列処理する複数のプロセスまたは複数の処理スレッド間の同期制御を行うマルチスレッド同期制御方式において、複数のプロセスまたは複数の処理スレッド間の同期をとるメッセージを複数のプロセスまたは複数の処理スレッドと送受信する送受信スレッドと、送受信スレッドが受信したメッセージを順次格納する受信メッセージキュー、複数のプロセスまたは複数の処理スレッドに送信する返信メッセージを格納する送信メッセージキューおよび受信時に読み飛ばしたメッセージを格納し待機させる未処理メッセージキューを有するメッセージキュー手段と、複数のプロセスまたは複数の処理スレッドにおける各処理状態を通知するオブジェクトを登録し管理するためのオブジェクト管理手段と、受信メッセージキューに格納された受信メッセージが同期型メッセージの場合、当該同期型メッセージを優先し当該メッセージの処理対象となるオブジェクトをオブジェクト管理手段で参照して登録すると共に、複数のプロセスまたは複数の処理スレッドの該当する処理を実行させる返信メッセージを送信メッセージキューに格納し、一方、受信メッセージキューに格納されたメッセージが非同期型メッセージの場合、オブジェクト管理手段の当該メッセージの処理対象となるオブジェクトがシグナル状態の時には当該メッセージを処理し、また非シグナル状態の時には当該非同期型メッセージを未処理メッセージキューに格納し、受信メッセージキューに同期型メッセージがない場合には未処理メッセージキューに格納した待機中の非同期型メッセージについて処理するメッセージ処理スレッドとを備えたものである。
【００１０】
この発明に係るマルチスレッド同期制御方式は、メッセージ処理スレッドは、受信メッセージキューに格納された受信メッセージが非同期型メッセージの場合、当該非同期型メッセージのうちから特定のメッセージのみを判定した後、当該メッセージの処理対象となるオブジェクトをオブジェクト管理手段でシグナル状態か調べて未処理メッセージキューに格納する対象とするようにしたものである。
【００１１】
【発明の実施の形態】
以下、この発明の実施の一形態を説明する。
実施の形態１．
図１はこの発明の実施の形態１乃至実施の形態３によるマルチスレッド同期装置の構成を示すブロック図である。図において、１００は複数のスレッド間の同期を制御する同期制御プロセスである。同期制御プロセス１００の構成において、１０２はメッセージの送受信を行う送受信スレッド、１０３は同期制御プロセス１００が受信するメッセージを処理するメッセージ処理スレッド、１０４は受信メッセージを格納する受信メッセージキュー、１０５は送信するメッセージを格納する送信メッセージキュー、１０６は読み飛ばしたメッセージを格納する未処理メッセージキュー、１０７はオブジェクトを管理するためのオブジェクト管理装置（オブジェクト管理手段）である。ここでは、メッセージ処理スレッド１０３により受信メッセージの処理を行うが、それは、オブジェクト管理装置１０７を用いてメッセージの処理対象となるオブジェクトを参照したり登録し、返信メッセージを作成することである。
【００１２】
送受信スレッド１０２において、１２１は送信部、１２２は受信部である。メッセージ処理スレッド１０３において、１３１は処理部、１３２は判定部である。オブジェクト管理装置１０７において、１１０，１１１，１１２はオブジェクトである。１６０ｓ，１６１ｓはオブジェクト１１０がシグナル状態になるのを待機しているスレッドオブジェクト、１１７はスレッドオブジェクト１６０ｓとスレッドオブジェクト１６１ｓからなるオブジェクト待ちリストである。
【００１３】
１５０，１５１は処理プロセス、１６０，１６１，１６２は処理スレッドである。ここで、受信部１２２は、処理プロセス１５０，１５１または処理スレッド１６０，１６１，１６２から来たメッセージを受信して、受信メッセージキュー１０４に格納する。送信部１２１は、送信メッセージキュー１０５から格納されたメッセージを取り出して、送信先のプロセス１５０，１５１または処理スレッド１６０，１６１，１６２にメッセージを送る。処理部１３１はメッセージの処理を行い、判定部１３２は受信したメッセージが同期型メッセージか非同期型メッセージかの判定を行う。
【００１４】
処理プロセス１５０は並列処理を行う手段で、そのため２つの処理スレッド１６０と１６１を有し、また処理プロセス１５１は処理スレッド１６２を有する。これら処理スレッド１６０，１６１，１６２は、同期制御プロセス１００とメッセージの送受信を行い、スレッドの実行順序を決めて同期をとる。それぞれの処理スレッド１６０，１６１，１６２は、同期制御プロセス１００にメッセージを送信する送信部１７０、同期制御プロセス１００からメッセージが来るまで待機する待ち部１７１、実際のスレッドの処理を行う処理部１７２、同期制御プロセス１００からメッセージを受信する受信部１７３を有する。
【００１５】
図２は実施の形態１に係るオブジェクト管理装置１０７が管理するオブジェクト１１０の構成を示す説明図である。ここで、オブジェクト１１０とは、例えばイベント、ミューテックス（ｍｕｔｅｘ）、セマフォ（ｓｅｍａｐｈｏｒｅ）などのことである。オブジェクト１１０は、オブジェクト名２００、オブジェクト識別子２０１、オブジェクトタイプ２０２、オブジェクトの状態２０３、オブジェクト固有の情報２０４を有する。オブジェクト名２００はオブジェクトの名称を表し、名称のないオブジェクトの場合はゼロが格納される。オブジェクト識別子２０１は、全てのオブジェクトに対して一意な値が割り振られる。オブジェクトタイプ２０２は、上記イベントやミューテックスなどを示す。オブジェクトの状態２０３は、シグナル状態または非シグナル状態をとる。ここで、シグナル状態とはスレッドが処理を行うことができるオブジェクトの状態（例えば、信号機でいえば青信号）を表し、また非シグナル状態とはスレッドが処理を行えないオブジェクトの状態（赤信号）を表す。非シグナル状態にある場合、スレッドはシグナル状態になるまで待機することになる。オブジェクト固有の情報２０４には、オブジェクトタイプ毎にそのタイプ固有の情報が格納される。
【００１６】
図３は、実施の形態１に係るスレッドオブジェクト１６０ｓの構成を示す説明図で、図において、スレッドオブジェクト１６０ｓは、並列処理を行う処理スレッド１６０と１対１に対応づけられ、処理スレッド１６０が、オブジェクト１１０（図２）がシグナル状態になるまで待機していることを示す。スレッドオブジェクト１６０ｓは、処理スレッド１６０が属する処理プロセス１５０のプロセス識別番号（識別子）２１０、処理スレッド１６０のスレッド識別番号（識別子）２１１、同期制御プロセス１００が処理スレッド１６０との送受信に用いる送受信用ディスクリプタ２１２から構成される。
【００１７】
図４は実施の形態１に係る処理スレッド１６０と同期制御プロセス１００の間で送受信されるメッセージ１４０の構成を示す説明図で、図において、メッセージ１４０は、メッセージ１４０を送信した処理プロセス１５０のプロセス識別番号２２０、処理スレッド１６０のスレッド識別番号２２１、メッセージタイプ２２２およびタイプ毎のメッセージ固有の情報２２３からなる。
メッセージのタイプは大きく分類すると、同期型メッセージと非同期型メッセージの２種類がある。同期型メッセージは、メッセージを送ったプロセスまたは処理スレッドが他のプロセスや他の処理スレッドの動作や状態には無関係に、同期制御プロセス１００が送受信できるもので、オブジェクトの生成・削除、オブジェクトの状態変更がこれにあたる。非同期型メッセージは、他のプロセスや他の処理スレッドの動作や状態によって、同期制御プロセス１００がすぐに返信できる場合と返信できない場合があるメッセージである。オブジェクトがシグナル状態になるのを待機するメッセージがこれにあたる。
【００１８】
図５はこの発明の実施の形態１および実施の形態２に係るメッセージ処理スレッド１０３の動作手順を示すフローチャートである。
まず、受信メッセージキュー１０４にメッセージがあるかどうかを調べる（ステップＳＴ１）。メッセージ１４０があれば、それが同期型メッセージか非同期型メッセージかどうかを調べる（ステップＳＴ２）。同期型メッセージであった場合には、そのメッセージ１４０を処理し（ステップＳＴ４）、必要であれば処理結果のメッセージ１４０ｒを作成し、メッセージ１４０ｒの送信が必要かどうか調べる（ステップＳＴ５）。メッセージ１４０ｒの送信が必要であれば、そのメッセージ１４０ｒを送信メッセージキュー１０５に格納する（ステップＳＴ６）。メッセージ１４０ｒの送信が不要な場合は、ステップＳＴ６をスキップして再びステップＳＴ１に戻り、次のメッセージについて同じ処理を行う。
【００１９】
一方、ステップＳＴ２において、メッセージ１４０が非同期型メッセージであった場合には、メッセージの処理対象となるオブジェクトがシグナル状態かどうかを調べる（ステップＳＴ３）。シグナル状態であった場合には、ステップＳＴ４に進みメッセージを処理する。また、非シグナル状態であった場合には、未処理メッセージキュー１０６に格納して、次のメッセージを先読みするためステップＳＴ１に戻る。
ステップＳＴ１において、次のメッセージがない場合には、未処理メッセージキュー１０６に、前に読み飛ばしたメッセージがあるかどうかを調べ（ステップＳＴ７）、あればそのメッセージを処理するためステップＳＴ４に進む。未処理メッセージキュー１０６にメッセージがなければ、次のメッセージを受信するまで待機する（ステップＳＴ８）。
【００２０】
図６は並列処理を行う処理プロセス１５０の動作手順を示すフローチャートである。
処理部１７２が処理を行い（ステップＳＴ５０）、処理スレッド１６０，１６１の実行順序の同期が必要かを調べ（ステップＳＴ５１）、必要な場合には同期処理用のメッセージ１４０を作成する（ステップＳＴ５２）。この作成されたメッセージ１４０を、送信部１７０により同期制御プロセス１００宛に送信し（ステップＳＴ５３）、待ち部１７１は返信メッセージ１４０ｒを受信するまで待機する（ステップＳＴ５４）。メッセージ１４０ｒが送られてきた場合、受信部１７３によりこれを受信して（ステップＳＴ５５）処理部１７２の処理に戻る。
【００２１】
図７は、３つの処理スレッド１６０，１６１，１６２が一連の処理Ａ，Ｂ，Ｃを分担して、並列処理を行う場合の模式図である。
処理スレッド１６０は処理Ａを担当し、処理スレッド１６１は処理Ｃを担当し、処理スレッド１６２は処理Ｂを担当する。ここで、処理Ａ，Ｂ，Ｃは、アルファベット順に処理が開始されるものと定義して、３つの処理スレッド１６０，１６１，１６２の実行順序を決めるものとする。
まず準備処理として、処理スレッド１６０は、処理Ａの状態を知らせるイベントを生成するため、同期制御プロセス１００にイベントを作成するメッセージを送る（ステップＳＴ１００）。同様に、処理スレッド１６１は処理Ｃの状態を知らせるイベントを生成するため、同期制御プロセス１００にイベントを作成するメッセージを送り（ステップＳＴ１２０）、また、スレッド１６２も処理Ｂの状態を知らせるイベントを生成するため、同期制御プロセス１００にイベントを作成するメッセージを送る（ステップＳＴ１４０）。
【００２２】
図８は処理Ａの場合におけるメッセージの構成を示す。処理Ａは無条件に処理を開始できるので、初期状態としてシグナル状態を設定する。図８のメッセージ３００は同期型メッセージである。同期制御プロセス１００では、送受信スレッド１０２の受信部１２２がメッセージ３００を受信して受信メッセージキュー１０４に格納する。
次いで、同期制御プロセス１００において、メッセージ処理スレッド１０３が前述の図５のフローチャートに従った処理を行う。今の場合、メッセージ３００は同期型メッセージなので、このことを判定部１３２で判定して本メッセージ３００の処理を行う（ステップＳＴ４）。この場合のメッセージタイプはイベント生成なので、図９に示すイベントオブジェクト４００を生成して、オブジェクト管理装置１０７に登録する。登録直後は、本イベントのオブジェクト待ちリスト１１７は空である。次に、メッセージ処理スレッド１０３は、イベントオブジェクト４００の生成が成功したことを通知する図８のメッセージ３００ｒを作成し、送信するためこのメッセージ３００ｒを送信メッセージキュー１０５に格納する（図５ステップＳＴ６）。次いで、送受信スレッド１０２の送信部１２１が送信メッセージキュー１０５からメッセージ３００ｒを取り出し、処理スレッド１６０に送信する。
【００２３】
処理Ｂについては図１０に示すメッセージ３０１を同様に送信する。処理Ｂは無条件には開始できないので、初期状態としては非シグナル状態を設定する。また、生成されるイベントオブジェクトは図１１に示す４０１である。処理Ｃについても処理Ｂと同様に行われる。
【００２４】
次に、処理スレッド１６０，１６１，１６２は、同時に処理を開始して並列に処理を行う。図１２および図１３はこの並列処理を行う場合の各送受信メッセージの構成について示す。
まず、処理スレッド１６０は処理Ａを開始するにあたって、処理Ａの状態を知らせる処理Ａイベントがシグナル状態になるまで待機するための図１２に示すメッセージ３０２を、同期制御プロセス１００に送る（ステップＳＴ１０１）。同様に、処理スレッド１６１も処理Ｃを開始するにあたって、処理Ｃの状態を知らせる処理Ｃイベントがシグナル状態になるまで待機するためのメッセージ３０３を、同期制御プロセス１００に送る（ステップＳＴ１２１）。また同様に、処理スレッド１６２も処理Ｂを開始するにあたって、処理Ｂの状態を知らせる処理Ｂイベントがシグナル状態になるまで待機するためのメッセージ３０４を、同期制御プロセス１００に送る（ステップＳＴ１４１）。
【００２５】
同期制御プロセス１００では、送受信スレッド１０２の受信部１２２がこれらの３つのメッセージ３０２，３０３，３０４を受信して受信メッセージキュー１０４に順に格納する。
次いで、メッセージ処理スレッド１０３が前述の図５のフローチャートに従った処理を行う。メッセージ３０２は非同期型メッセージなのでステップＳＴ２、ステップＳＴ３と進む。ステップＳＴ３において、オブジェクト管理装置１０７に登録されている処理Ａイベント（オブジェクト）がシグナル状態かを調べると、処理可能なシグナル状態なのでステップＳＴ４にて本メッセージ３０２の処理を行う。処理Ａイベントがシグナル状態であることを通知するメッセージ３０２ｒを作成し、ステップＳＴ６にてメッセージ３０２ｒを送信メッセージキュー１０５に格納する。次いで、送受信スレッド１０２の送信部１２１が送信メッセージキュー１０５からメッセージ３０２ｒを取り出し、処理スレッド１６０に送信する。
【００２６】
次に、同期制御プロセス１００のメッセージ処理スレッド１０３は、再びステップＳＴ１（図５）に戻り、メッセージ３０３の処理を続ける。メッセージ３０３は、非同期型メッセージなのでステップＳＴ２、ステップＳＴ３と進む。ステップＳＴ３において、処理Ｃイベント（オブジェクト）がシグナル状態かを調べると、非シグナル状態なので、メッセージ３０３を未処理メッセージキュー１０６に格納してステップＳＴ１に戻り、次のメッセージ３０４の処理を行う。メッセージ３０４についても、同様に処理イベントＢ（オブジェクト）が非シグナル状態なので、メッセージ３０４を未処理メッセージキュー１０６に格納する。
【００２７】
一方、メッセージ３０２ｒを受け取った処理スレッド１６０は、処理Ａを開始し（図７、ステップＳＴ１０２）、直後に処理Ｂを開始してよいことを通知するために、処理Ｂイベントの状態をシグナル状態に変更するメッセージ３０５（図１３）を同期制御プロセス１００に送る（ステップＳＴ１０３）。すると、同期制御プロセス１００では、送受信スレッド１０２の受信部１２２が本メッセージ３０５を受け取り、受信メッセージキュー１０４に格納する。この段階における各メッセージキューの状態は図１４に示されるが、３０３，３０４，３０５は上述した各メッセージを表す。
【００２８】
再び同期制御プロセス１００において、メッセージ処理スレッド１０３は、ステップＳＴ１（図５）にて、受信メッセージキュー１０４からメッセージ３０５を取り出す。メッセージ３０５は同期型メッセージなので、ステップＳＴ４に進みメッセージ処理を行う。すなわち、オブジェクト管理装置１０７に登録してあるイベントオブジェクト４０１（図１１）の処理Ｂイベント（イベントオブジェクト）の状態を非シグナル状態からシグナル状態に変更する。この段階では、オブジェクト待ちリスト１１７が空で、処理Ｂイベントがシグナル状態になるのを待機しているオブジェクトはないので、これ以上の処理は行わず、返信メッセージ３０５ｒを作成して送信メッセージキュー１０５に格納する。送信部１２１がこのメッセージ３０５ｒを送信メッセージキュー１０５から取り出して処理スレッド１６０に送信する。
【００２９】
次に、再びステップＳＴ１（図５）に戻るが、受信メッセージキュー１０４にはこれ以上メッセージがないので、未処理メッセージキュー１０６からメッセージ３０３を取り出し、ステップＳＴ４（図５）に進み処理を行う。メッセージ３０３は処理Ｃイベントがシグナル状態になるのを待機するメッセージである。この段階ではオブジェクト管理装置１０７に登録してある処理Ｃイベント（オブジェクト）は非シグナル状態、すなわち処理Ｂはまだ開始されていないため、スレッドオブジェクト１６１ｓを処理Ｃイベントのオブジェクト待ちリスト１１７に追加する。この場合には、メッセージの送信は不要であるのでステップＳＴ６をスキップする。
【００３０】
次に、再び未処理メッセージキュー１０６からメッセージ３０４を取り出し、ステップＳＴ４（図５）に進む。メッセージ３０４は処理Ｂイベントがシグナル状態になるのを待機するメッセージである。この段階ではオブジェクト管理装置１０７に登録してある処理ＢイベントＢ（オブジェクト）はシグナル状態、すなわち処理Ａは開始されているので、ステップＳＴ６（図５）に進み、処理Ｂイベントがシグナル状態であることを通知するメッセージ３０４ｒを生成して送信メッセージキュー１０５に格納する。次いで、送受信スレッド１０２の送信部１２１が送信メッセージキュー１０５からメッセージ３０４ｒを取り出して、処理スレッド１６２に送る。
【００３１】
処理スレッド１６２は、メッセージ３０４ｒを受け取ると処理Ｂを開始する（図７、ステップＳＴ１４２）。その直後に、処理Ｃを開始してよいことを通知するために、処理Ｃイベントの状態をシグナル状態に変更するメッセージ３０６を同期制御プロセス１００に送る（ステップＳＴ１４３）。すると、送受信スレッド１０２の受信部１２２が本メッセージ３０６を受け取り、受信メッセージキュー１０４に格納する。
【００３２】
再び同期制御プロセス１００において、メッセージ処理スレッド１０３は、ステップＳＴ１（図５）にて、受信メッセージキュー１０４からメッセージ３０６を取り出す。メッセージ３０６は同期型メッセージなのでステップＳＴ４（図５）に進み処理を行う。すなわち、オブジェクト管理装置１０７に登録してある処理Ｃイベント（オブジェクト）の状態をシグナル状態に変更する。オブジェクト管理装置１０７では、処理Ｃイベントのオブジェクト待ちリスト１１７に、スレッドオブジェクト１６１ｓが格納されていることが分り、オブジェクト待ちリスト１１７からスレッドオブジェクト１６１ｓを削除する処理を行う。同時に、スレッドオブジェクト１６１ｓの待機を解除するメッセージ３０３ｒを作成し、このメッセージ３０３ｒとメッセージ３０６の処理が成功したことを通知するメッセージ３０６ｒを送信メッセージキュー１０５に格納する。次に送受信スレッド１０２の送信部１２１は、メッセージ３０６ｒを処理スレッド１６２に、またメッセージ３０３ｒを処理スレッド１６１に送信する。処理スレッド１６１は、このメッセージ３０３ｒを受け取り、処理Ｃを開始する（ステップＳＴ１２２）。
このように、処理Ｂを担当する処理スレッド１６２に関しては、処理Ａが開始するまで待機するメッセージを送信し、処理Ｂが待機している間に処理スレッド１６０が処理Ａを開始し、処理Ｂについては先読み操作することで、オブジェクト管理装置１０７に登録されることなく、同期を実現できる。
【００３３】
以上のように、この実施の形態１によれば、送受信スレッド１０２により複数のプロセスまたは複数の処理スレッド間の同期をとるメッセージを送受信し、受信したメッセージを順次格納する受信メッセージキュー１０４、メッセージキュー手段として、返信メッセージを格納する送信メッセージキュー１０５および読み飛ばしたメッセージを格納し待機させる未処理メッセージキュー１０６を有し、オブジェクト管理装置１０７により複数のプロセスまたは複数の処理スレッドにおける各処理状態を通知するオブジェクトを登録し管理し、メッセージ処理スレッド１０３により、受信メッセージキュー１０４に格納された受信メッセージが同期型メッセージの場合、当該メッセージの処理対象となるオブジェクトをオブジェクト管理装置１０７で参照して登録すると共に、複数のプロセスまたは複数の処理スレッドの該当する処理を実行させる返信メッセージを送信メッセージキュー１０５に格納し、一方、受信メッセージキュー１０４に格納されたメッセージが非同期型メッセージの場合、オブジェクト管理装置１０７の当該メッセージの処理対象となるオブジェクトがシグナル状態の時には当該メッセージを処理し、また非シグナル状態の時には当該非同期型メッセージを未処理メッセージキュー１０６に格納し、同期型メッセージに該当する複数のプロセスまたは複数の処理スレッドによる処理が終了すると未処理メッセージキュー１０６に格納した待機中の非同期型メッセージについて処理する。したがって、送受信スレッド１０２とメッセージ処理スレッド１０３を別に設け、未処理メッセージキュー１０６を設けたことにより、メッセージ処理中に送られてきた次のメッセージを先読みして対応でき、先読み操作により、すべての複数のプロセスまたは複数の処理スレッドのオブジェクトを登録し、かつオブジェクト管理装置１０７からオブジェクトを削除するという複雑な作業を省略でき、オーバーヘッドを削減する効果が得られる。
【００３４】
実施の形態２．
図１５は、この発明の実施の形態２に係る並列処理を説明する模式図である。
処理スレッド１６０，１６１，１６２は一連の処理Ａ，Ｂ，Ｃを分担して実施する。処理スレッド１６０は処理Ａを担当し、処理スレッド１６１は処理Ｃを担当し、処理スレッド１６２は処理Ｂを担当する。ここで、処理Ｂと処理Ｃは処理Ａが終了した後に処理を開始するものと定義して、処理スレッド１６０，１６１，１６２の実行順序を決めるものとする。
【００３５】
次に動作について説明する。
まず、準備処理として、処理スレッド１６０は処理Ａの状態を知らせるイベントオブジェクトを生成するため、同期制御プロセス１００にイベントを作成するメッセージを送る（ステップＳＴ１１０）。この処理Ａの場合におけるメッセージは、図１６に示される内容を持つメッセージ３１０である。このイベントは処理Ａが終了したらシグナル状態にセットされることを意味し、初期状態では非シグナル状態に設定される。メッセージ３１０は同期型メッセージである。
【００３６】
同期制御プロセス１００において、送受信スレッド１０２の受信部１２２がメッセージ３１０を受信して受信メッセージキュー１０４に格納する。次いで、メッセージ処理スレッド１０３が、前述の図５に示すフローチャートに従った処理を行う。
今の場合は、メッセージ３１０は同期型メッセージであるからステップＳＴ４（図５）にてメッセージ処理を行う。またこの場合、メッセージタイプがイベント生成なので、処理Ａイベント（オブジェクト）を生成して、オブジェクト管理装置１０７に登録する。登録直後は、本イベントのオブジェクト待ちリスト１１７は空である。さらに、処理Ａイベントの生成が成功したことを通知するメッセージ３１０ｒ（図示せず）を作成する（ステップＳＴ１１０）。次に、メッセージの送信が必要なので、ステップＳＴ６（図５）にてメッセージ３１０ｒを送信メッセージキュー１０５に格納する。次いで、送受信スレッド１０２の送信部１２１が送信メッセージキュー１０５からメッセージ３１０ｒを取り出し、処理スレッド１６０に送信する。
【００３７】
次に、処理スレッド１６０，１６１，１６２は同時に処理を開始して、並列処理を行う。処理スレッド１６０は無条件に処理Ａを開始（ステップＳＴ１１１）する。処理スレッド１６１は処理Ｃを開始するにあたって、処理Ａが終了したことを知らせる処理Ａイベント（オブジェクト）がシグナル状態になるまで待機するためのメッセージ３１１（図示せず）を、同期制御プロセス１００に送る（ステップＳＴ１３０）。同様に、処理スレッド１６２は処理Ｂを開始するにあたって、処理Ａが終了したことを知らせる処理Ａイベント（オブジェクト）がシグナル状態になるまで待機するためのメッセージ３１２（図示せず）を、同期制御プロセス１００に送る（ステップＳＴ１５０）。
【００３８】
同期制御プロセス１００では、送受信スレッド１０２の受信部１２２がこれらの２つのメッセージ３１１，３１２を受信して受信メッセージキュー１０４に順次に格納する。次いで、メッセージ処理スレッド１０３が図５に示すフローチャートに従った処理を行う。
メッセージ３１１は非同期型メッセージなので、ステップＳＴ２、ステップＳＴ３と進む。ステップＳＴ３において、オブジェクト管理装置１０７に登録されている処理Ａイベント（オブジェクト）がシグナル状態か調べると、非シグナル状態なので、本メッセージ３１１を未処理メッセージキュー１０６に格納してステップＳＴ１（図５）に戻り、メッセージ３１２の処理を続ける。メッセージ３１２においても、同様に処理イベントＡ（オブジェクト）が非シグナル状態なので、本メッセージ３１２を未処理メッセージキュー１０６に格納する。
【００３９】
一方、処理スレッド１６０は処理Ａを行い、処理を終了する（ステップＳＴ１１２）。処理Ａが終了したことを通知するために、処理Ａイベント（オブジェクト）の状態をシグナル状態に変更するメッセージ３１３（図示せず）を同期制御プロセス１００に送る（ステップＳＴ１１３）。すると、同期制御プロセス１００において、送受信スレッド１０２の受信部１２２が本メッセージ３１３を受け取り、受信メッセージキュー１０４に格納する。この段階における各メッセージキュー１０４，１０５，１０６の状態は図１７に示されが、３１１，３１２，３１３は上述の各メッセージを表す。
【００４０】
同期制御プロセス１００において、再びメッセージ処理スレッド１０３は、ステップＳＴ１（図５）に戻り、受信メッセージキュー１０４からメッセージ３１３を取り出す。メッセージ３１３は同期型メッセージなのでステップＳＴ４に進み、オブジェクト管理装置１０７に登録してある処理Ａイベントの状態をシグナル状態に変更する。この段階では、オブジェクト待ちリスト１１７が空で、処理Ａイベント（オブジェクト）がシグナル状態になるのを待機しているオブジェクトはないので、これ以上の処理は行わず、返信メッセージ３１３ｒ（図示せず）を作成して送信メッセージキュー１０５に格納する。送信部１２１がこのメッセージ３１３ｒを処理スレッド１６０に送信する。
【００４１】
次に、再びメッセージ処理スレッド１０３は、ステップＳＴ１（図５）に戻るが、受信メッセージキュー１０４にはこれ以上メッセージがないので、未処理メッセージキュー１０６からメッセージ３１１を取り出し、ステップＳＴ４に進み処理を行う。メッセージ３１１は処理Ａイベントがシグナル状態になるのを待機するメッセージである。この段階では、オブジェクト管理装置１０７に登録してある処理Ａイベント（オブジェクト）はシグナル状態、すなわち処理Ａは終了しているため、ステップＳＴ６（図５）に進み、処理Ａイベントがシグナル状態であることを通知するメッセージ３１１ｒ（図示せず）を生成して送信メッセージキュー１０２に格納する。
【００４２】
次に、メッセージ処理スレッド１０３は、再び未処理メッセージキュー１０６からメッセージ３１２を取り出し、ステップＳＴ４（図５）に進む。メッセージ３１２も同様に処理Ａイベントがシグナル状態になるのを待機するメッセージである。この段階では、オブジェクト管理装置１０７に登録してある処理Ａイベント（オブジェクト）はシグナル状態、すなわち処理Ａは終了しているため、ステップＳＴ６に進み、処理Ａイベントがシグナル状態であることを通知するメッセージ３１２ｒ（図示せず）を生成して送信メッセージキュー１０５に格納する。
【００４３】
送受信スレッド１０２の送信部１２１が、送信メッセージキュー１０５から上記メッセージ３１１ｒ，３１２ｒを取り出して、それぞれ処理スレッド１６１とスレッド１６２に送る。処理スレッド１６１はメッセージ３１１ｒを受け取り、処理Ｃを開始する。同様に、処理スレッド１６２はメッセージ３１２ｒを受け取り、処理Ｂを開始する。
【００４４】
以上のように、実施の形態２によれば、処理Ｂを担当する処理スレッド１６２と処理Ｃを担当する処理スレッド１６１は、処理Ａが終了するまで待機するメッセージ３１１，３１２を送信し、待機している間に、処理スレッド１６０が処理Ａを終了して、メッセージ３１３を送信するようにしたものである。また、処理スレッド１６２と処理スレッド１６１がメッセージを送信した段階では、まだ処理Ａが終了していないが、メッセージ処理スレッド１０３と送受信スレッド１０２を別スレッドとしたことで、メッセージ処理スレッド１０３がメッセージ３１１，３１２を未処理メッセージキュー１０６に格納している間にメッセージ３１３が受信メッセージキュー１０４に格納され、このメッセージ３１３がメッセージ３１１，３１２よりも優先して、すなわち先読み処理されることで、メッセージ３１１，３１２の処理対象となるオブジェクトがオブジェクト管理装置１０７に登録されることなく処理を終了することができ、その分で効率化が図れる効果が得られる。また処理Ａの終了を示すメッセージ３１３が処理スレッド１６１と処理スレッド１６２に送信されることで、１対２のメッセージ通信においても先読みでき、さらには、送信側と受信側でＮ対Ｎの通信に適用できるため、複数のプロセスまたは複数の処理スレッド間での実行順序を決めることができる効果が得られる。
【００４５】
実施の形態３．
上記実施の形態１および実施の形態２では、メッセージが非同期型メッセージなら全て読み飛ばしの対象にしたが、非同期型メッセージの中でも、頻繁に状態が変更されるものだけを読み飛ばしの対象にしてさらに効率化を図ることもできる。例えば、イベント、セマフォ、ミューテックスの中で、イベントが頻繁に状態が変更される場合に利用するとした場合には、イベント待ちのメッセージのみを読み飛ばしの対象にし、それ以外は読み飛ばしの対象にしないことでさらに効率化できる。
【００４６】
図１８は実施の形態３に係るメッセージ処理スレッド１０３の処理手順を示すフローチャートである。図において、ステップＳＴ２０９が図５と異なる部分で、その他は同様な処理であり、その部分の説明を省略する。
メッセージ処理スレッド１０３の判定部１３２は、受信メッセージキュー１０４に受信メッセージがあった場合（ステップＳＴ２０１）に、それが同期型メッセージかを調べる（ステップＳＴ２０２）。非同期型メッセージであった場合には、さらに読み飛ばし対象のメッセージかどうかを調べる（ステップＳＴ２０９）。このことで、特定のメッセージのみを先読みの対象にすることができる。
【００４７】
以上のように、実施の形態３によれば、先読みしてから、最終的にオブジェクト管理装置１０７に登録されると、先読み操作の分だけ非効率的になるが、状態変化が頻繁起こるオブジェクトのみを読み飛ばすようにしてオブジェクトのタイプ毎に先読みするかどうかを決めるようにしたので、より効率的に処理を行える効果が得られる。
【００４８】
【発明の効果】
以上のように、この発明によれば、一連の処理を分担して並列処理する複数のプロセスまたは複数の処理スレッド間の同期制御を行うマルチスレッド同期制御方式において、複数のプロセスまたは複数の処理スレッド間の同期をとるメッセージを複数のプロセスまたは複数の処理スレッドと送受信する送受信スレッドと、送受信スレッドが受信したメッセージを順次格納する受信メッセージキュー、複数のプロセスまたは複数の処理スレッドに送信する返信メッセージを格納する送信メッセージキューおよび受信時に読み飛ばしたメッセージを格納し待機させる未処理メッセージキューを有するメッセージキュー手段と、複数のプロセスまたは複数の処理スレッドにおける各処理状態を通知するオブジェクトを登録し管理するためのオブジェクト管理手段と、受信メッセージキューに格納された受信メッセージが同期型メッセージの場合、当該同期型メッセージを優先し当該メッセージの処理対象となるオブジェクトをオブジェクト管理手段で参照して登録すると共に、複数のプロセスまたは複数の処理スレッドの該当する処理を実行させる返信メッセージを送信メッセージキューに格納し、一方、受信メッセージキューに格納されたメッセージが非同期型メッセージの場合、オブジェクト管理手段の当該メッセージの処理対象となるオブジェクトがシグナル状態の時には当該メッセージを処理し、また非シグナル状態の時には当該非同期型メッセージを未処理メッセージキューに格納し、受信メッセージキューに同期型メッセージがない場合には未処理メッセージキューに格納した待機中の非同期型メッセージについて処理するメッセージ処理スレッドとを備えるように構成したので、送受信スレッドとメッセージ処理スレッドを別スレッドとして、メッセージ処理スレッドは送受信スレッドが受信したメッセージを先読みすると同時に、送受信スレッドも並行して送受信を行うことで先読みをより効果的に行い、先読みをすることでメッセージの処理時間そのものを短縮し、また送信側と受信側でＮ対Ｎの同期を可能にする効果がある。さらに、オブジェクト管理手段を備えてオブジェクトを管理しているので、３つ以上の処理プロセスまたは処理スレッド間での同期制御が可能になる効果がある。
【００４９】
この発明によれば、メッセージ処理スレッドは、受信メッセージキューに格納された受信メッセージが非同期型メッセージの場合、当該非同期型メッセージのうちから特定のメッセージのみを判定した後、当該メッセージの処理対象となるオブジェクトをオブジェクト管理手段でシグナル状態か調べて未処理メッセージキューに格納する対象とするように構成したので、状態変化が頻繁起こるような特定のオブジェクトのみを読み飛ばすようにしてオブジェクトのタイプに応じて先読みするかどうかを決めることで、より効率的に処理を行える効果がある。
【図面の簡単な説明】
【図１】この発明の実施の形態１乃至実施の形態３によるマルチスレッド同期装置の構成を示すブロック図である。
【図２】同実施の形態１に係るオブジェクトの構成を示す説明図である。
【図３】同実施の形態１に係るスレッドオブジェクトの構成を示す説明図である。
【図４】同実施の形態１に係る送受信メッセージの構成を示す説明図である。
【図５】同実施の形態１および実施の形態２に係るメッセージ処理スレッドの動作手順を示すフローチャートである。
【図６】同実施の形態１に係る並列処理を行う処理プロセスの動作手順を示すフローチャートである。
【図７】同実施の形態１に係る並列処理を説明する模式図である。
【図８】同実施の形態１に係る送受信メッセージの構成を示す説明図である。
【図９】同実施の形態１に係るイベントオブジェクトの構成を示す説明図である。
【図１０】同実施の形態１に係る送受信メッセージの構成を示す説明図である。
【図１１】同実施の形態１に係るイベントオブジェクトの構成を示す説明図である。
【図１２】同実施の形態１に係る並列処理時の各送受信メッセージの構成を示す説明図である。
【図１３】同実施の形態１に係る並列処理時の各送受信メッセージの構成を示す説明図である。
【図１４】同実施の形態１に係るメッセージキューの状態例を示す説明図である。
【図１５】同実施の形態２に係る並列処理を説明する模式図である。
【図１６】同実施の形態２に係る送信メッセージの構成例を示す説明図である。
【図１７】同実施の形態２に係るメッセージキューの状態例を示す説明図である。
【図１８】同実施の形態３に係るメッセージ処理スレッドの処理手順を示すフローチャートである。
【図１９】従来の同期化方式の構成を示すブロック図である。
【符号の説明】
１　記憶部、２　待ち部、３　実行部、４　受信部、５　送信部、６　解除部、７　全受信部、８　全実行部、９　全送信部、１０　判定部、１００　同期制御プロセス、１０２　送受信スレッド、１０３　メッセージ処理スレッド、１０４　受信メッセージキュー、１０５　送信メッセージキュー、１０６　未処理メッセージキュー、１０７　オブジェクト管理装置（オブジェクト管理手段）、１１０，１１１，１１２　オブジェクト、１１７　オブジェクト待ちリスト、１２１　送信部、１２２　受信部、１３１　処理部、１３２　判定部、１４０，１４０ｒ　メッセージ、１５０，１５１　処理プロセス、１６０，１６１，１６２　処理スレッド、１６０ｓ，１６１ｓ　スレッドオブジェクト、１７０　送信部、１７１　待ち部、１７２　処理部、１７３　受信部、２００　オブジェクト名、２０１　オブジェクト識別子、２０２　オブジェクトタイプ、２０３　オブジェクトの状態、２０４　オブジェクト固有の情報、２１０　プロセス識別番号、２１１　スレッド識別番号、２１２　送受信用のディスクリプタ、２２０　プロセス識別番号、２２１　フレッド識別番号、２２２　メッセージタイプ、２２３　メッセージ固有の情報、３００〜３０６，３１０，３００ｒ〜３０６ｒ　メッセージ、４００，４０１　イベントオブジェクト。
【図１】
2004030312.tif 000003
【図２】
2004030312.tif 000004
【図３】
2004030312.tif 000005
【図４】
2004030312.tif 000006
【図５】
2004030312.tif 000007
【図６】
2004030312.tif 000008
【図７】
2004030312.tif 000009
【図８】
2004030312.tif 000010
【図９】
2004030312.tif 000011
【図１０】
2004030312.tif 000012
【図１１】
2004030312.tif 000013
【図１２】
2004030312.tif 000014
【図１３】
2004030312.tif 000015
【図１４】
2004030312.tif 000016
【図１５】
2004030312.tif 000017
【図１６】
2004030312.tif 000018
【図１７】
2004030312.tif 000019
【図１８】
2004030312.tif 000020
【図１９】
2004030312.tif 000021