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