Storage z/OS PL/I受控变量是否在过程的单独调用之间保留?

Storage z/OS PL/I受控变量是否在过程的单独调用之间保留?,storage,mainframe,pl-i,Storage,Mainframe,Pl I,z/OS PL/I受控变量是否在过程的单独调用之间保留?假设我们需要一个计数器,它位于子例程内部,并在调用过程中保持不变。最简单的方法是使用初始化为零的静态变量,并在子例程的每个条目上递增。但是,如果程序必须是可重入的,就不能这样做。所以问题是我们是否有权访问在前一次调用中分配的受控变量。下面的代码可以工作吗 PROC1: PROCEDURE OPTIONS(MAIN); ... CALL A; ... A: PROCEDURE; DECLARE COUNT CONTROLLED ALIGNED

z/OS PL/I受控变量是否在过程的单独调用之间保留?假设我们需要一个计数器,它位于子例程内部,并在调用过程中保持不变。最简单的方法是使用初始化为零的静态变量,并在子例程的每个条目上递增。但是,如果程序必须是可重入的,就不能这样做。所以问题是我们是否有权访问在前一次调用中分配的受控变量。下面的代码可以工作吗

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可写,静态存储中有一个锚。对于NORENT NOWRITABLEFWS,有一个指向锚自动存储的地址。有一个额外的间接层次。对于NORENT NOWRITABLEPRV,似乎存在一个静态表,每个受控变量都有一个到私有表的偏移量。换句话说,根据处理选项,变量可能是可访问的,也可能不是。它没有提到任何关于使用租金选项的内容。
有什么想法吗?

根据PL/I编程指南编译时选项RENT,如果不改变任何静态变量,代码自然是可重入的

RENT选项指定编译器接受不自然可重入的代码并使其可重入

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

请参考此链接=>

根据J.K.Hughes的PL/I结构化编程,可重入过程可以被其他过程异步调用。例如,任务B调用SQRT函数。当此函数正在计算平方根时,具有比任务B更高执行优先级的任务A需要获得对系统的控制并使用SQRT函数。中断SQRT功能并保存任务B的中间结果;然后任务A使用SQRT函数。
当任务A完成其执行时,控制权将在中断点返回给任务B。然后,任务B完成了对SQRT函数的使用

根据PL/I编程指南编译时选项RENT,如果代码不改变任何静态变量,那么它自然是可重入的

RENT选项指定编译器接受不自然可重入的代码并使其可重入

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

请参考此链接=>

根据J.K.Hughes的PL/I结构化编程,可重入过程可以被其他过程异步调用。例如,任务B调用SQRT函数。当此函数正在计算平方根时,具有比任务B更高执行优先级的任务A需要获得对系统的控制并使用SQRT函数。中断SQRT功能并保存任务B的中间结果;然后任务A使用SQRT函数。
当任务A完成其执行时,控制权将在中断点返回给任务B。然后,任务B完成了对SQRT函数的使用

这更适合于堆栈溢出,因为它涵盖了特定的编码问题,而不是一般的原则/架构。请原谅我的无知,但这段代码是用什么语言编写的?我假设某个非常古老的东西,但我不知道它是什么。我会在主过程中使用DCL并分配计数器变量,然后在PROC A中进行递增。变量将在作用域中,并且将始终存在,直到主过程终止。这将更适合堆栈溢出,因为它涉及特定的编码问题,而不是一般的原则/架构。请原谅我的无知,但这段代码使用的是什么语言?我假设某个非常古老的东西,但我不知道它是什么。我将在主过程中DCL并分配计数器变量,然后在过程A中进行递增。该变量将在范围内,并且将始终存在,直到主过程终止。