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