在过程的单独调用之间是否保留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语言参考,在分配变量后,不需要释放它(尽管这通常是一种很好的做法),并且"所有受控存储都在程序结束时释放。"它并没有说存储在块结束时被释放。PL/I编程指南在定位受控变量部分的使用PLIDUMP一章中提供了一些线索,但它并不是决定性的。它说,定位受控变量的关键是找到它的锚。对于NORENT WRITEABLE,在静态存储中有一个锚点。对于NORENT NOWRITABLE(FWS),有一个到锚点自动存储的地址。(有一个额外的间接级别。)对于NORENT NOWRITABLE(PRV),似乎有一个静态表,每个受控变量都有一个到私有表的偏移量。换句话说,根据处理选项的不同,变量可能是可访问的,也可能不是。它没有说明任何关于使用RENT选项的内容。有什么想法吗?
根据PL/I编程指南编译时选项"RENT",如果代码不更改任何静态变量,则它是"自然可重入的"。
RENT选项指定编译器接受非自然可重入的代码并使其可重入。
因此,如果使用RENT选项编译程序,则可以在子程序的每个条目上增加STATIC变量。
请参阅此链接=>PL/I编程指南中的租金选项
根据J.K.Hughes的"PL/I结构化编程",其他程序可以异步调用REENTRANT程序。例如,任务B调用SQRT函数。当该函数正在计算平方根时,任务A(具有比任务B更高的执行优先级)需要获得对系统的控制并使用SQRT函数。SQRT功能被中断,任务B的中间结果被保存;则任务A使用SQRT函数。当任务A完成其执行时,控制权在任务B被中断的点返回到任务B。然后,任务B完成了对SQRT函数的使用。