マルチスレッド・アプリケーション

ILE RPG には、マルチスレッド環境で操作するための、同時と逐次化という 2 つのモードがあります。それぞれのモードには利点と欠点があります。ご使用のアプリケーションの 各モジュールごとに、適合する操作モードを選択することができます。

スレッドの RPG サポートにより、静的記憶域が確実にスレッド・セーフな方法で 処理されます。ただし、アプリケーションのスレッド・セーフティーのその他の側面については、 ユーザーの責任で行ってください。アプリケーションが使用するすべてのプログラムがスレッド・セーフであること、 共用記憶域はすべてスレッド・セーフな方法で管理すること、および スレッド・セーフなシステムの側面のみを使用することを確認する必要があります。
表 1. RPG におけるスレッド・セーフティー・モードの比較
問題 THREAD(*CONCURRENT) THREAD(*SERIALIZE)
スレッド・セーフティーを達成するために ソース変更は必要ですか (THREAD キーワードのコーディング以外)。 いいえ。ただし、並行スレッドの数が非常に大きい場合、モジュールが使用する 静的記憶域の量を減らすために、ソース・コード変更が必要となる場合が あります。 いいえ
モジュール内での静的記憶域の処理による デッドロックのリスクはありますか。 SERIALIZE がプロシージャー仕様書でコーディングされている場合は、あります。 はい。リスクは高いです。デッドロックはモジュール・レベルで発生する 可能性があります。THREAD_A がモジュール MOD_1 にあり、THREAD_B がモジュール MOD_2 にある場合、 各スレッドは他のモジュール内のプロシージャーを呼び出そうとします。
モジュールはマルチスレッドの実行によって利益を 得ますか。 はい いいえ
ボトルネックのリスクがありますか。 SERIALIZE キーワードがプロシージャー仕様書でコーディングされている場合は、 あります。 はい。リスクは高いです。モジュールへのアクセスの逐次化により、 モジュールはアプリケーション内のボトルネックになる可能性があります。 あるスレッドがモジュールでアクティブになっている場合、他のスレッドは、すべてのプロシージャーにおいて最初のスレッドがモジュールで実行されなくなるまで待つ必要があります。
スレッド・ローカル記憶域はサポートされていますか。 はい。これは静的記憶域のデフォルト・タイプです。 いいえ
all-thread 静的記憶域はサポートされていますか。 はい はい。これは唯一サポートされている静的記憶域のタイプです。
RPG プログラマーは、静的変数がスレッド・ローカルであるか、またはすべてのスレッドによって共用されるかを選択することができますか。 はい いいえ。all-thread 静的記憶域のみがサポートされています。
実行時に必要なメモリー量に関する問題はありますか。 可能性があります。モジュールに必要な静的記憶域の量は、 モジュールを使用しているスレッドの数によって乗算されます。 いいえ。すべてのスレッドが同じ静的記憶域を使用します。
対象ユーザーは誰ですか。 複数のスレッドでの実行によるパフォーマンスの利点を求めており、 各スレッドが使用するスレッド・ローカル静的記憶域の量を受け入れる用意があるか、 RPG モジュールを再作成して、できるだけ少量の静的記憶域を使用したい (あるいはその両方) RPG プログラマー。 モジュールを再作成して静的記憶域の量を減らすことを 望まない RPG プログラマー、または THREAD(*CONCURRENT) で必要となるスレッドごとの追加記憶域について懸念する RPG プログラマー。 複数のスレッドが同時にモジュール内でプロシージャーを実行する場合、RPG プログラマーは、 モジュールがボトルネックになる可能性があるという事実を受け入れます。

詳細については、マルチスレッド化に関する考慮事項を参照してください。