スレッドは、以下のいずれかのメソッドで作成されます。
最初の 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.