3

z/OS PL/I CONTROLLED 変数は、プロシージャーの個別の呼び出し間で保持されますか? サブルーチンの内部にあり、呼び出し間で保持されるカウンターが必要だとしましょう。これを行う最も簡単な方法は、ゼロに初期化され、サブルーチンへのエントリごとにインクリメントされる静的変数を使用することです。しかし、プログラムが再入可能でなければならない場合、それはできません。問題は、以前の呼び出しで割り当てられた制御変数にアクセスできるかどうかです。次のコードは機能しますか?

PROC1: PROCEDURE OPTIONS(MAIN);
...
CALL A;
...
A: PROCEDURE;
DECLARE COUNT CONTROLLED ALIGNED FIXED BIN(15);
IF (ALLOCATION(COUNT) = 0)
    THEN ALLOCATE COUNT INIT(1);
    ELSE COUNT = COUNT + 1;
...
END A;

END PROC1;

PL/I 言語リファレンスによると、変数を ALLOCATE した後は変数を解放する必要はなく (ただし、一般的には解放することをお勧めします)、「管理されているすべてのストレージはプログラムの最後に解放されます」。ブロックの最後にストレージが解放されるとは言いません。PL/I プログラミング ガイドの「制御変数の検索」セクションの「PLIDUMP の使用」の章にいくつかの手がかりが示されていますが、決定的なものではありません。制御変数を見つけるための鍵は、そのアンカーを見つけることです。NORENT WRITABLE では、静的ストレージにアンカーがあります。NORENT NOWRITABLE(FWS) には、アンカー自動ストレージへのアドレスがあります。(余分なレベルの間接性があります。) NORENT NOWRITABLE(PRV) を使用すると、制御変数ごとにプライベート テーブルへのオフセットを持つ静的テーブルが存在するように見えます。言い換えると、処理オプションによっては、変数にアクセスできる場合とできない場合があります。RENT オプションの使用については何も述べていません。何かご意見は?

4

1 に答える 1

1

As per the PL/I Programming Guide compile time option "RENT", Your code is "naturally reentrant" if it does not alter any of its static variables.

The RENT option specifies that the compiler is to take code that is not naturally reentrant and make it reentrant.

Thus, you can increment STATIC variable on each entry to subroutine if the program is compiled with RENT option.

Please refer to this link => Rent Option from PL/I Programming Guide

As per "PL/I Structured Programming" by J.K. Hughes, A REENTRANT procedure may be called by other procedures asynchronously. For example task B invokes SQRT function. While this function is in process of computing square root, task A (having higher execution priority than task B) needs to gain control of the system and use SQRT function. The SQRT function is interrupted and intermediate results for task B saved; then task A uses SQRT function. When task A completes its execution, control is returned to task B at the point where it was interrupted. Then, task B completes its use of SQRT function.

于 2012-03-27T12:13:12.377 に答える