スレッドの作成と終了

スレッドは、以下のいずれかのメソッドで作成されます。

最初の 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.