多线程:重入、拟重入和线程安全程序

多线程是一种技术,在此技术中,应用程序的单个副本可以由多个事务同时处理。 例如,一个事务可以开始执行应用程序。 当到达 EXEC CICS 命令 (导致 CICS® WAIT 并调用分派器) 时,另一个事务可以执行应用程序的同一副本。 将此技术与单线程 (即执行程序到完成) 进行比较: 先完成一个事务对程序的处理,然后另一个事务才能使用该程序。

多线程要求所有 CICS 应用程序都是准重入程序; 即,它们必须在入口点和出口点之间串行可复用。 使用 EXEC CICS 接口的 CICS 应用程序会自动遵循此规则。 对于 COBOL、C® 和 C++ 程序,每次调用程序时都会获得一份新的工作存储副本,从而确保程序的重入性。 您应该始终在编译或预链接实用程序上使用 RENT 选项,即使对于不具有可写状态和自然可重入的 C 和 C++ 程序也是如此。 CICS 翻译器插入的临时变量和 DFHEIPTR 字段通常被定义为可写静态变量,需要使用 RENT 选项。 要使这些程序保持可重入,变量数据不应在 PL/I 中作为静态存储出现,也不应在汇编语言程序 CSECT 中作为 DC 出现。

除了要求将应用程序编译和链接编辑为可重入程序之外, CICS 还将程序标识为准可重入程序或线程安全程序; 这些属性是在 PROGRAM 资源定义上设置的。 下表显示了程序上可用的 CONCURRENCY 和 API 设置以及运行应用程序的 TCB 类型。

表 1. PROGRAM CONCURRENCY 和 API 设置的组合以及使用的 TCB 类型
CONCURRENCY 属性 API 属性 CICS TCB
并行 (准租用) API (CICSAPI) 应用程序始终在 CICS 拟重入 (QR TCB) 下运行。 如果对资源管理器切换到开放式 TCB ,那么 CICS 始终在返回到应用程序之前返回到 QR TCB。
并行 (准租用) API (OPENAPI) 组合无效。 OPENAPI 程序无法在 QR TCB 上运行。
并行 (线程安全) API (CICSAPI) 应用程序可以在 QR TCB 或开放式 TCB 上运行。 如果切换到资源管理器的开放式 TCB ,那么 CICS 在返回到应用程序时将保留在开放式 TCB 上。 如果切换到 QR TCB ,那么返回到应用程序时, CICS 将保留在 QR TCB 上。
并行 (线程安全) API (OPENAPI) 与 CONCURRENCY (REQUIRED) API (OPENAPI) 相同。
并行 (必需) API (CICSAPI) 应用程序始终在开放式 TCB 上运行。 CICS 服务不需要 TCB 密钥匹配,因此应用程序始终在 L8 开放式 TCB 上运行。 OPENAPI 资源管理器使用 L8 TCB ,因此如果调用了 TCB 开关,那么不需要进行 TCB 切换。 如果切换到 QR TCB ,那么 CICS 会在返回到应用程序时返回到开放式 TCB。
并行 (必需) API (OPENAPI) 应用程序始终在开放式 TCB 上运行。 TCB 的键必须与程序的执行键匹配。 CICS 使用 L9 TCB (如果设置了 EXECKEY (USER)) 和 L8 TCB (如果 EXECKEY ( CICS )) 设置。 如果应用程序是用户密钥,并且调用了 OPENAPI 资源管理器,那么将发生从 L9 TCB 到 L8 TCB 的切换。 CICS 在返回到应用程序之前返回到 L9 TCB。 如果切换到 QR TCB ,那么 CICS 会在返回到应用程序时返回到开放式 TCB。