最適化された効率的なプログラムを作成するためには、次の点に注意してください。
- アプリケーションがシングルスレッドとマルチスレッドのどちらのランタイム システムで実行されているかを確認するコードを、アプリケーションに必ず追加します。
- 可能であれば、NOREENTRANT コンパイラ指令と NOSERIAL コンパイラ指令 (デフォルト) を使用してください。これらのコンパイラ指令を使用すると、スタック領域と呼び出しエントリのオーバヘッドを最小化できます。ただしプログラマは、これらの指令を使用するプログラムを一度に 1 つのスレッドだけでアクティブにするようにしなければいけません。
- REENTRANT(1) コンパイラ指令を使用すると、スタック領域の使用量が増加しますが、プログラムの呼び出し速度に大きく影響することはありません。
- SERIAL プログラム属性を使用すると、呼び出し速度に大きく影響しますが、プログラムに必要なスタック領域の使用量には影響しません。
- Local-Storage Section を使用してスレッドの作業変数を保持します。これにより、スタックの使用量が増えますが、データの割り当ては高速で行います。
- Thread-Local-Storage Section を使用すると、呼び出し速度に大きく影響します。Working-Storage Section のかわりに Thread-Local-Storage Section を使用すると、簡単にアプリケーション全体でスレッドを保護できます。
- 簡単なロック処理には、ミューテックスを使用してください。ミューテックスは、最も高速な同期構造体です。
- 読み込み/書き込みの問題が発生する可能性のあるプログラムでマルチスレッドを最も効率化するには、モニターを使用します。
- シングルスレッドモードでは、可能であれば同期データ項目をすべて初期化してください。初期化でない場合は、first-time フラグを使用してください。このフラグは、CBL_THREAD_PROG_LOCK を呼び出す前に一度チェックされ、ロックを取得した後に再度チェックされます。
- スレッドとスレッド ハンドルの相違を忘れないでください。デタッチされていないスレッドは、必要な場合にだけ作成します。
- CBL_THREAD_KILL は、どうしても必要な場合のみに使用します。使用する場合は、実行後すぐに実行単位を終了してください。可能な場合は、代わりに終了ポーリングを使用します。
- CBL_THREAD_YIELD よりも、CBL_THREAD_SUSPEND を使用します。ビジーによる待機状態は回避してください。
- CBL_THREAD_LIST_START 呼び出しと CBL_THREAD_LIST_END 呼び出しの間の作業量は最小限にします。
- 特定の状況では、アプリケーションは Thread-Local-Storage Section よりも CBL_TSTORE_n ルーチンを使用して、各スレッド メモリを保存することができます。
- 発生したデッドロックを修正するのではなく、デッドロックが発生しないように注意してください。
- 読み込みロックをモニターにネストさせないでください。ネストさせる必要がある場合は、シングル スレッドのデッドロックが発生する可能性があることを認識してください。
マルチスレッド アプリケーションで使用できるコンパイラ指令は、マルチスレッド アプリケーションおよびシングルスレッド アプリケーションの性能に影響します。