モジュール間のデッドロックの防止方法

状況によっては、THREAD(*SERIALIZE) 制御仕様書キーワード以外の機能を使用してモ ジュールの同期化を制御する必要があります。 例えば、2 つのプロシージャー PROC1 と PROC3 が同時に呼び出されている場合を考 えてみます。 再帰的呼び出しが実際に行われなくても、PROC1 は PROC4 を呼び出す場合 、MOD2 がアンロックするのを待ち、PROC3 は PROC2 を呼び出す場合、MOD1 がアンロックするのを待ちます。 モジュールはそれぞれ他方のモジュール内でスレッドによってロックされるため、これらの プロシージャーは呼び出しを完了することができません。このタイプの問題は、モジュ ールへの呼び出しを逐次化した場合でも発生する可能性があるもので、デッドロ ックと呼ばれます。

図 75. デッドロックの例
デッドロックの例

この例は、ILE RPG 同期化手法を用いて同時に同じモジュール内の複数のプロ シージャーにアクセスすることができないことを示しています。

上の例のような問題を避け、スレッド・セーフのアプリケーションを確実にするためには 、C またはプラットフォーム関数によって提供される手法を用いてモジュールの同期化 を制御します。各スレッドについて、PROC1 または PROC3 の呼び出し元はいずれも、次 のことを行う必要があります。

  1. 現行スレッド以外のすべてのスレッドについてモジュールへのアクセスを、必ず同 じ順序で (例えば、MOD1 の次に MOD2) 制御する
  2. 現行スレッドで、モジュール内でプロシージャーを呼び出す (PROC1 および PROC3)
  3. ステップ 1 の逆順で、すべてのスレッドについてモジュール へのアクセスを解放する (MOD2 の次に MOD1)

1 つのスレッドで MOD1 へのアクセス制限が正しく実行されます。MOD1 および MOD2 の すべてのユーザーは、この順序での MOD1 および MOD2 へのアクセスを制限する プロトコルを使用するため、最初のスレッドがモジュールへのアクセスを制限されてい るかぎり、他のスレッドは MOD1 または MOD2 内でプロシージャーを呼び出すことはで きません。このような状況では、同じモジュール内の複数のプロシージャーに同時にア クセスすることはできますが、このモジュールは現行スレッドでしか使用できないため、ス レッド・セーフです。

この方法は、共用記憶域へのアクセスを同期する場合にも適用できます。