【问题标题】:Is a z/OS PL/I CONTROLLED variable preserved between separate invocations of a procedure?z/OS PL/I CONTROLLED 变量是否在过程的单独调用之间保留?
【发布时间】:2012-03-07 18:54:21
【问题描述】:

在不同的过程调用之间是否保留了 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 Programming Guide 在定位受控变量部分的使用 PLIDUMP 一章中提供了一些线索,但它不是确定的。它说定位受控变量的关键是找到它的锚。 NORENT WRITABLE 在静态存储中有一个锚。 NORENT NOWRITABLE(FWS) 有一个锚点自动存储的地址。 (有一个额外的间接级别。)使用 NORENT NOWRITABLE(PRV) 似乎有一个静态表,每个受控变量在私有表中都有一个偏移量。换句话说,根据处理选项,变量可能是可访问的,也可能不是。它没有说明使用 RENT 选项。 有什么想法吗?

【问题讨论】:

  • 这更适合 Stack Overflow,因为它涵盖了特定的编码问题,而不是一般原则/架构。
  • 原谅我的无知,但是这段代码是用什么语言编写的?我假设有些东西很老,但我不知道它是什么。
  • 我会在 MAIN 过程中对计数器变量进行 DCL 和分配,然后在 PROC A 中进行递增。该变量将在范围内,并且在 MAIN 过程终止之前一直存在。

标签: storage mainframe pl-i


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-20
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2014-08-07
    相关资源
    最近更新 更多