26.4 マルチスレッド対応COBOLプログラムの開始と終了
マルチスレッドプログラムの実行を開始する方法には,次の三つがあります。
-
COBOL以外のプログラムからの呼び出しによる方法
-
マルチスレッド対応COBOLプログラムをスレッド開始関数として指定する方法
-
マルチスレッド対応COBOLプログラムをアプリケーションの主プログラムにする方法
それぞれの開始方法と終了方法について説明します。
- 〈この節の構成〉
(1) COBOL以外のプログラムからの呼び出しによる方法
COBOLプログラム以外のプログラムを入り口としてスレッドを開始して,そのプログラムから間接的にマルチスレッド対応COBOLプログラムを呼び出せます。
この方法では,スレッド内で最初に呼ばれるCOBOLプログラムが,COBOL主プログラムの場合と,COBOL副プログラムの場合とで,プログラム終了時の動作が異なります。COBOL主プログラムと副プログラムについては,「18.3 COBOL主プログラムと副プログラム」を参照してください。
(a) COBOL主プログラムの場合
-MainNotCBLオプションを指定しないでコンパイルしたプログラムがスレッド内で最初に実行された場合,COBOL主プログラムになります。
COBOL主プログラムを終了させるには,STOP RUN文を実行します。これによって,COBOL実行環境が終了し,スレッドが終了されます。このとき,RETURN-CODE特殊レジスタの値がスレッドの終了コードになります。
(b) COBOL副プログラムの場合
-MainNotCBLオプションを指定してコンパイルしたプログラムは,スレッド内で最初に実行した場合でも,常にCOBOL副プログラムとなります。
COBOL副プログラムは,呼び出し元のプログラムに復帰できます。このとき,COBOL実行環境は保持されます。そのため,呼び出し元のプログラムは,スレッドが終了する前にCOBOL実行環境を終了させる必要があります。COBOL実行環境を終了させるには,CBLENDサービスルーチンを呼び出します。
なお,この方法でマルチスレッド対応COBOLプログラムを呼び出した場合,呼び出し元のプログラムで例外ハンドラを登録して,例外処理できます。このとき,例外ハンドラブロックでCBLDBGINFサービスルーチンを呼び出せば,COBOLの異常終了時要約情報リストを出力できます。CBLDBGINFサービスルーチンの詳細は,「30.6.1 CBLDBGINF」を参照してください。
(2) マルチスレッド対応COBOLプログラムをスレッド開始関数として指定する方法
マルチスレッド対応COBOLプログラムを入り口としてスレッドを開始した場合,このプログラムが終了したときにCOBOL実行環境を終了し,スレッドが終了します。このとき,RETURN-CODE特殊レジスタに指定した値が,スレッドの終了コードになります。
この方法では,プログラム実行中にハードウェア例外が発生しても,プログラムでの例外処理はできません。ハードウェア例外が発生したときには,システムの例外処理が実行されます。なお,共通例外処理で検出できる例外については,シングルスレッドのCOBOLプログラムと同じように,アプリケーションプログラムでの例外処理ができます。
- 注意事項
-
この方法を用いる場合は,プログラムをコンパイルする時に-MainNotCBLオプションを指定しないでください。
図26‒2 COBOLプログラムがスレッド開始関数となる例
(3) マルチスレッド対応COBOLプログラムをアプリケーションの主プログラムにする方法
マルチスレッド対応COBOLプログラムに対して,-Main,Systemまたは-Main,V3オプションを指定してコンパイルしたCOBOLプログラムは,アプリケーションの主プログラムになります。この場合,COBOLプログラムがプライマリスレッドになります。
マルチスレッド対応COBOLプログラムがアプリケーションの主プログラムである場合,マルチスレッド対応COBOLプログラムが終了したときに,その中のすべてのスレッドが終了していれば,プロセスが終了します。プログラムの実行が終了するためには,プログラムの実行によって発生したすべてのスレッドが終了する必要があります。
なお,コンパイル時に例外を検知するオプション(-DebugInfオプションなど)を指定した場合,プライマリスレッド内で発生した例外を取得できます。
(4) 戻り文に対する動作
上記(1)〜(3)の方法について,戻り文に対する動作の違いを,次に示します。
COBOLプログラムの種類 |
STOP RUN文 |
GOBACK文 |
EXIT PROGRAM文 |
---|---|---|---|
COBOL主プログラム |
STOP RUN文を実行したスレッドが終了する。 |
GOBACK文を実行したスレッドが終了する。 |
何も動作しない。 |
COBOL副プログラム |
STOP RUN文を実行したスレッドが終了する。 |
呼び出し元に制御が戻る。 |
呼び出し元に制御が戻る。 |