THREAD キーワードに関する活動化グループの考慮事項
- THREAD キーワードが指定されているときは、デフォルトの活動化グループを実行しないようにしてください。
- THREAD(*CONCURRENT) の場合、DFTACTGRP(*YES) でコンパイルされたプログラムは、別のスレッドで現在実行中であると、LR オンで戻ることも異常で戻ることもできません。 プログラムの非活動化をこのプログラム自体が試みた場合、非活動化は MCH4405 で失敗します。
- THREAD(*SERIALIZE) の場合、またはプロシージャー仕様書に SERIALIZE キーワードが指定されている THREAD(*CONCURRENT) の場合は、プログラムがデフォルトの活動化グループで実行されると、RPG ランタイムは、モジュールまたはプロシージャーへのアクセスを直列化するために使用された mutex を破棄できません。
場合によっては、RPG プログラムの終了後に、モジュールの静的記憶域に入っている、mutex を指すポインターが割り振り解除または上書きされることがあります。
その場合は、mutex を指すポインターが失われたとき、mutex に関連付けられているシステムの記憶域が解放されないため、記憶域不足になる可能性があります。
RPG プログラムが再び呼び出されると、RPG プログラムは新しい mutex を作成します。
このような状況は以下の場合に起こることがあります。
- プログラムが THREAD(*SERIALIZE) および DFTACTGRP(*YES) でコンパイルされ、プログラムが LR オンで終了するか、または異常終了して、プログラムが非活動化される。 プログラムが非活動化されると、プログラムの静的記憶域が割り振り解除されます。
- RCLRSC コマンドが使用され、mutex を使用してモジュールまたはプロシージャーを直列化するプログラムがデフォルトの活動化グループで実行された。 プログラムが DFTACTGRP(*YES) でコンパイルされるか、または呼び出し元がデフォルトの活動化グループに存在する ACTGRP(*CALLER) でコンパイルされると、プログラムはデフォルトの活動化グループで実行されます。
- セカンダリー・スレッドで実行されるプログラムの場合は、ACTGRP(*NEW) でコンパイルしないようにしてください。 ACTGRP(*NEW) でコンパイルされたプログラムがセカンダリー・スレッド内で終了すると、ジョブはメッセージ CEE0200 が終了します。