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 Language Reference,在 ALLOCATE 一个变量之后,您不需要释放它(尽管这通常是一种好的做法),并且“所有受控存储都在程序结束时被释放”。它并没有说存储在块的末尾被释放。PL/I 编程指南在定位受控变量部分的使用 PLIDUMP 一章中提供了一些线索,但它不是确定的。它说定位受控变量的关键是找到它的锚。NORENT WRITABLE 在静态存储中有一个锚。NORENT NOWRITABLE(FWS) 有一个锚点自动存储的地址。(有一个额外的间接级别。)使用 NORENT NOWRITABLE(PRV) 似乎有一个静态表,其中每个受控变量的私有表都有一个偏移量。换句话说,根据处理选项,也许变量是可访问的,也许不是。它没有说明使用 RENT 选项。有什么想法吗?

4

1 回答 1

1

根据 PL/I Programming Guide 编译时选项“RENT”,如果您的代码不改变其任何静态变量,则它是“自然可重入的”。

RENT 选项指定编译器将采用不是自然可重入的代码并使其成为可重入的。

因此,如果程序是使用 RENT 选项编译的,您可以在子程序的每个条目上增加 STATIC 变量。

请参考此链接 => PL/I Programming Guide 中的 Rent Option

根据 JK Hughes 的“PL/I Structured Programming”,REENTRANT 过程可以被其他过程异步调用。例如任务 B 调用 SQRT 函数。该函数在计算平方根的过程中,任务 A(执行优先级高于任务 B)需要获得系统控制权并使用 SQRT 函数。SQRT 函数被中断,任务 B 的中间结果被保存;然后任务 A 使用 SQRT 函数。当任务 A 完成执行时,控制权将返回到任务 B 的中断点。然后,任务 B 完成了对 SQRT 函数的使用。

于 2012-03-27T12:13:12.377 回答