すべてのプログラムが、再入可能としてコンパイルできるわけではありません。使用する COBOL 機能によっては、再入可能なプログラムのコンパイルを妨げることがあります。ANSI 標準の COBOL に含まれる、このような古い初期の COBOL 機能は使用しないでください。次の機能を使用するプログラムは、REENTRANT 指令ではコンパイルできません。
- COBOL DEBUG 機能
- 手続き部オーバーレイ - NOSEG または NOOVL 指令のどちらかを指定すると、この機能を使用していてもコンパイルできます。
- PROGRAM-ID 文の IS INITIAL 句 - REENTRANT"2" を指定すると、この機能を使用していてもコンパイルできます。
- STICKY-LINKAGE コンパイラ指令
- STICKY-PERFORM コンパイラ指令
再入可能なプログラムを作成する場合、注意が必要なその他の制約は、次のとおりです。
- ほとんどのファイル処理文は、前述の同期プリミティブの 1 つで明示的に保護する必要があります。ファイル ハンドラーは内部的にスレッドを保護します。しかしユーザー プログラムでは、ファイル レコード、バッファー、および状態フィールドはロックされずに設定されます。この結果として競合が発生し、これらのフィールドが壊れることがあります。ファイル処理文を保護する手段を取ってください。
- ファイル操作の実行は、グローバルなファイル処理ミューテックスによって、ファイル ハンドラー内でシリアル化されます。つまり、任意のファイルにある時点でアクセスできるのは、1 つのスレッドだけです。ただし、ファイルからの読み込みが何らかの理由で遅れた場合は、問題が発生します。たとえば、レコードのロック処理です。この場合、他のスレッドは、遅延している読み込みが終了するまでファイル処理操作を実行できません。
- 整列操作 (SORT) の実行は、グローバルなファイル処理ミューテックスにより、整列ハンドラー内でシリアル化されます。整列操作の実行中に、他のスレッドは別の整列操作またはファイル処理操作を実行できません。INPUT 手続きと OUTPUT 手続きの実行は、ソート操作を開始するスレッドで行われます。これらの手続き内のファイル処理は、正常に実行されます。
- DISPLAY 文を実行するには、同期プリミティブの 1 つでユーザーを保護する必要があります。コンソール表示ハンドラーは、内部的にスレッドを保護します。ただし、表示が複雑な場合は、複数の表示ハンドラー呼び出しに分割されます。この結果として、データ項目がインターリーブ表示される可能性があります。一般に、マルチスレッド アプリケーションでは、コンソール I/O に割り当てるスレッドを 1 つだけにするのが最良の方法です。
- ネストされたプログラムは、新しく作成するスレッドの開始点になることはできません。スレッド作成の開始点にできるのは、エントリ ポイント、コンパイル単位の一番外側のプログラム、および他言語の外部エントリ ポイントだけです。
- ACCEPT 文の実行は、受諾ハンドラー内でシリアル化されます。これにより、ACCEPT が確認待ちの間は、他のすべてのスレッドが ACCEPT 操作や DISPLAY 操作を実行できません。
次に挙げる性能とリソースに関する弊害は、マルチスレッド アプリケーションの再入可能な COBOL プログラムで発生します。
- スレッド局所記憶節の使用により、プログラム エントリ上のコストが非常に高くなることがあります。可能な場合には、代わりに局所記憶節をスレッド局所作業変数に対して使用します。プログラム エントリのオーバヘッドは CALL 処理速度を最適化すると、最小にすることができます。
- 再入可能なプログラムは、標準 COBOL プログラムやシリアル COBOL プログラムよりも、多くのスタック領域を使用します。これはシステム作業領域を、静的にではなく動的にスタックに割り当てる必要があるためです。