ジョブ間同期・通信マクロ実行
信号通信(信号の送受信)
- 信号通信のしくみ
-
ここではジョブ間同期・通信マクロ実行のうち、信号通信について説明します。
ジョブ間同期・通信マクロ実行によって、セマフォの機能を実現することができます。
ジョブ間同期・通信マクロ実行を使ったセマフォの仕組みを簡単に説明します。
(1)IJCC(カウンタ)を作ります。このときにカウンタの初期値(=同時使用可能な資源の個数)を設定しておきます。
カウンタができていれば、信号の送受信(セマフォ操作)ができます。
(2)まずプログラムとIJCC(カウンタ)を接続します。
(3)資源を使いたい時点で信号の受信(一般的にはPオペレーションとかP操作とか言われています)を行います。
(4)資源を使い終わったら信号の送信(Vオペレーション、V操作)を行います。
(5)終わったら後片付けです。カウンタとの接続を解除します。
(6)このIJCC(カウンタ)が不要になったら、IJCCを削除します。
IJCCとか信号の受信/送信などA−VX特有の用語になっていますが、セマフォ、P操作、V操作と考えれば、それほど難しくはありません。
念のために、複数のプログラムで信号の送受信を行ったときの動きも書いてみました。
まず、プログラムAでもBでもCでもDでもいいので、誰かがIJCC(カウンタ)を作ります。
下の例では、プログラムBが初期値1でIJCCを生成しました。
プログラムAがIJCCに接続します。
プログラムAが信号の受信をします。受信をするとプログラムA側にあるカウンタがプラス1されます。
そしてIJCCのカウンタがマイナス1されて、0になりました。
他のプログラムもIJCCに接続したとします。(このタイミングで接続した事にするのは、あくまでも例なので、実際の接続はもっと前、例えばプログラムAがIJCCに接続する前でも、逆に後でも、一斉に接続しても、バラバラのタイミングで接続しても、どんな順番でも全然かまわない。)
他のプログラムが信号の受信をしようとしたとします。IJCC(カウンタ)がゼロなので、これらのプログラムは受信待ちになります。信号を受信できるまで、プログラムが停止することになります。(待つのか、待たずにエラーを返却するのかなどは受信するときのパラメータによります。この例は説明を簡単にするため待つことにします。)
プログラムAが信号の送信をします。送信するとプログラムA側にあるカウンタがマイナス1されて、代わりにIJCCのカウンタがプラス1されます。
IJCCのカウンタが1になったので、受信待ちになっているプログラムがそれを受信します。
受信したプログラムのカウンタがプラス1され、IJCCのカウンタがマイナス1されて0になります。(下の例ではプログラムCが受信した)
複数のプログラムが受信待ちしているときは、その中のどれかが受信します。どれが受信するかはあらかじめわかりません。IJCCのカウンタが0になったので、残りのプログラムが受信できず、受信待ちのままです。
プログラムAはIJCCはもう使わないことになりました。もう使わないので、IJCCとの接続を解除します。
いろいろと処理を行って、そのうち他のプログラムもIJCCを使わないことになりました。これらのプログラムもIJCCとの接続を解除します。
業務も終わったので、IJCCは不要となりました。最後にIJCCをシステム上から削除します。
このような感じで使用します。
後にサンプルプログラムを用意したので、それも参考にしてください。