スレッドを制御するライブラリ ルーチンを使用して、別のスレッドの終了を待ち、その戻り値を獲得するスレッドを実装できます。
以下の方法のいずれかによって、これらのライブラリ ルーチンを使用して作成されたスレッドを終了する必要があります。
- STOP RUN を使用して終了する
- CBL_THREAD_EXIT を使用してする
- CBL_THREAD_KILL を使用して強制終了する
- 元のエントリ ポイントから戻る
スレッドはスレッド制御ルーチン以外で作成される場合があります。ただし、このようなスレッドも、ランタイム システム サービスを使用すると、ランタイム システムで認識されます。これらのスレッドにはスレッド制御ライブラリ ルーチンを通してアクセスできます。スレッドが使用するライブラリ ルーチンは次のとおりです。
- CBL_THREAD_LIST_START、CBL_THREAD_LIST_NEXT、および CBL_THREAD_LIST_END ルーチン。スレッドはこれらのルーチンのリストにも表示されます。
- CBL_THREAD_IDDATA_ALLOC および CBL_THREAD_IDDATA_GET ルーチン。
- スレッド自身から情報を取得する CBL_THREAD_SELF ルーチン。
- CBL_THREAD_SUSPEND および CBL_THREAD_RESUME ルーチン。.NET Framework を使用するマネージ アプリケーションの場合は、これらのルーチンは使用されません。「.NET Framework におけるマルチスレッド」を参照してください。
- 使用中にスレッド自身をデタッチする CBL_THREAD_DETACH ルーチン。ただし、この呼び出しは事実上は何もしません。デタッチ呼び出しに関係なく、他言語プログラムのスレッドが使用するリソースは、そのスレッドがランタイム システムの使用を終了し、cobthreadtidy() を呼び出したときに解放されます。cobthreadtidy() を呼び出さずに、他言語プログラムのスレッドを終了するのは規約違反です。
混合言語を使用する環境で、ランタイム システムを使用しているためにランタイム システムに認識されているスレッドが、そのランタイム システムまたはスレッド制御ルーチン以外で作成されている場合は、次のいずれかを実行する必要があります。
- 終了する前に cobthreadtidy() を呼び出します。この呼び出しにより、ランタイム システムのサービスが不要になり、スレッド状態データをクリアしてもよいことをランタイム システムに対して通知します。.NET Framework を使用するマネージ アプリケーションの場合は、このルーチンは使用されません。「.NET Framework におけるマルチスレッド」を参照してください。
- cobtidy() を呼び出して、COBOL ランタイム システムはこのアプリケーション実行ではもう必要ないことを示します。.NET Framework を使用するマネージ アプリケーションの場合は、このルーチンは使用されません。「.NET Framework におけるマルチスレッド」を参照してください。
- cobexit() を呼び出して、実行単位を終了します。.NET Framework を使用するマネージ アプリケーションの場合は、このルーチンは使用されません。「.NET Framework におけるマルチスレッド」を参照してください。
- CBL_THREAD_KILL を呼び出す別のスレッドを使用して、スレッドを強制終了しないでください。スレッドが最初に作成された機構と一致する強制終了機構を使用してください。
- CBL_THREAD_WAIT を呼び出す別のスレッドを使用して待機しないでください。スレッドが最初に作成された機構と一致する待機機構を使用してください。
- CBL_THREAD_EXIT ルーチンを使用してスレッドを終了しないでください。スレッドが最初に作成された機構と一致する終了機構を使用してください。
アプリケーションは、CBL_GET_OS_INFO または CBL_THREAD_SELF を呼び出して、プログラムが使用するランタイム システムがスレッド制御ルーチンをサポートするかどうかを確認できます。
例 - プログラムがサポートするランタイム システムの確認
call "CBL_THREAD_SELF" using thread-id
on exeception
* no cbl_thread routines support
end-call
if return-code = 1008
* running in a single-threaded-only rts
end-if