スレッドは、以下のいずれかのメソッドで作成されます。
最初の 2 つの方法で作成されたスレッドは、COBOL スレッドと呼ばれます。オペレーティングシステムによって直接作成されたスレッドは、他言語スレッドと呼ばれます。
COBOL スレッドの作成と操作が汎用的で優れているので、ここでは COBOL スレッドについてのみ説明します。
スレッドの開始点は、ネストされてないプログラム名、COBOL エントリポイント、または C 言語などの他言語で記述された外部ルーチンであることが必要です。ネストされたプログラム名、節名、または段落名を開始点とすることはできません。
開始点の名前は、テキスト文字列で指定できます。テキスト文字列を使用してエントリポイントを見つける処理のオーバヘッドは、CALL 識別子 を検索するオーバーヘッドと同じです。START 文に手続きポインターを使用すると、このオーバヘッドを回避できます。
作成された各スレッドの開始点のパラメーターは 1 つのみです。このパラメーターを渡すときに BY CONTENT 指定を使用すると、システムはスレッドを作成する前にコピーを作成し、呼び出し側のスレッドが、START 文からの戻り値に基づいて元のパラメーターを自由に変更できるようにします。
ハンドルがデタッチされていないスレッドを作成 (IDENTIFIED BY 句を使用) すると、WAIT 文を使用して戻り値を後で取得できます。WAIT 文の終了後、指定したスレッド ハンドルは無効となり、そのスレッドに関連付けられたリソースはすべて解放されます。
作成されたスレッドで STOP RUN RETURNING 文を使用すると、実行単位は終了しません。この文は戻り値を返し、スレッドを終了するのみです。これは、次のコードと同じことになります。
call 'CBL_THREAD_EXIT' using by value address of thread-parm.
他言語スレッドの STOP RUN 文、または CBL_THREAD_CREATE 以外で作成された実行単位の主スレッドの STOP RUN 文は、アクティブな COBOL スレッドがすべて終了するのを待って、実行単位を終了します。
スレッドからの戻り値は、常にポインターです。このポインターにより、簡単なデータ構造体と複雑なデータ構造体の両方を返すことができます。
スレッドは、STOP RUN を実行するか、または CBL_THREAD_EXIT を呼び出してスレッド自身を終了できます。また、EXIT PROGRAM または GOBACK により開始点のプログラムが終了すると、通常 スレッドも終了します。また、他のスレッドが COBOL スレッドを終了させるのに役立つ場合もあります。たとえば、CBL_THREAD_KILL ルーチンを使用すると、COBOL スレッドが終了します。
例 - スレッドの作成と終了
$set reentrant Data Division. Working-Storage Section. 01 thread-handle usage pointer. 01 thread-return usage pointer. Linkage Section. 01 thread-parm picture x(32). 01 thread-return-record picture x(32). Procedure Division. *> Starting point call 'CBL_THREAD_CREATE' using 'CREATED ' *> Note the space before the second single-quotation-mark 'This is a 32 character parameter' by value 0 *> Optional parameter size 1 *> Flag to create non-detached 0 *> Default priority 0 *> Default stack by reference thread-handle if return-code = 0 call 'CBL_THREAD_WAIT' using by value thread-handle by reference thread-return set address of thread-return-record to thread-return display thread-return-record end-if stop run. Entry "CREATED" using thread-parm. display thread-parm stop run returning address of thread-parm.
このアプリケーションは、開始点が CREATED であるスレッドを作成します。作成されたスレッドはパラメーターを表示し、親スレッドで使用するためにそのパラメーターのアドレスを返します。CREATED スレッドの STOP RUN RETURNING は、実行単位を終了しません。代わりに戻り値を返し、スレッドを終了します。これは、次のコードと同じことになります。
call 'CBL_THREAD_EXIT' using by value address of thread-parm.