アプリケーションの初期化

マルチスレッド アプリケーションの初期化には、いくつかの注意が必要です。正しいプログラミング方法としては、最初に、アプリケーションがマルチスレッドをサポートするランタイム システムで動作するかどうかを決定する必要があります。次の例を参照してください。

例 - ランタイム システムの確認

 Working-Storage Section.
 01 thread-id     usage pointer.
 . . .
* Initialization code executed while in single-threaded 
* mode to check if the run-time system supports 
* multi-threading or the CBL_THREAD_ routines.
     call 'CBL_THREAD_SELF' using thread-id
      on exception
*        No cbl_thread routines support
     end-call
     if return-code = 1008
*        Running in a single-threaded rts
     end-if

この例では、ランタイム ライブラリ ルーチン CBL_THREAD_SELF を使用して、ランタイム システムがマルチスレッドをサポートしているかどうかを判断します。

ランタイム システムがマルチスレッドをサポートしていることをアプリケーションが認識した場合は、同期プリミティブのすべてを、適切な OPEN 文によって初期化する必要があります。最も簡単な方法は、アプリケーション内で他のスレッドが作成される前に、主プログラムの一部として初期化を行う方法です。ただし、アプリケーション設計、モジュール構成、または混合言語などの理由により、この方法で初期化ができない場合には、Micro Focus 社が提供する各プログラムごとの初期化済みミューテックスを使用できます。このミューテックスには、CBL_THREAD_PROG_LOCK と CBL_THREAD_PROG_UNLOCK ランタイムライブラリ ルーチンを使用してアクセスします。これらのルーチンを使用すると、プログラムのローカル同期プリミティブのハンドルを、アプリケーションの実行中に確実に 1 回のみ初期化できます。

例 - ライブラリ ルーチンを使用したスレッドのロック

次のコードでは、ライブラリ ルーチンを使用して、プログラムをマルチスレッド モードで実行中に初期化する例を示します。

 Working-Storage Section.
 01 first-flag         pic x comp-x value 1.
    88 first-time       value 1.
    88 not-first-time   value 0.
  
* Initialization code executed while in multi-threaded mode.
* Ensures that program local data is initialized properly.

     if first-time then
         call 'CBL_THREAD_PROG_LOCK'
         if first-time then
* Initialize program local data and synchronization objects
               ...
             set not-first-time   to true
         end-if
         call 'CBL_THREAD_PROG_UNLOCK'
     end-if

レベル-88 のデータ項目 first-time を二重チェックしていることに注目してください。これは、マルチスレッド アプリケーションの優れた最適化方法です。最適化の目的は、意図するアクションがすでに実行されている場合にミューテックスをロックするオーバヘッドをなくすことです。この例では、複数のスレッドが、正しく初期化される前のプログラムを実行すると、first-time が真であることを検出し、CBL_THREAD_PROG_LOCK を呼び出します。ただし、first-time が真の間に 1 つのスレッドだけはロックを獲得します。ロックを取得したスレッドが初期化を行います。

初期化を終了し、初期化を行ったスレッドがロックを獲得している間に、first-time フラグが偽に設定されます。これ以後にロックを獲得しようとするスレッドは、first-time が偽なので初期化が既に完了していると判断し、プログラムのロックをただちに解除します。初期化後に起動されたスレッドはすべて、first-time フラグが偽のために、プログラム ロックの獲得を行いません (そのため、プログラム エントリのオーバヘッドが減ります)。

初期化が行われているかどうかを示すフラグは、可能な限り簡単なものにしてください (1 バイトのデータ項目など)。