多线程:重入、拟重入和线程安全程序
多线程是一种技术,在此技术中,应用程序的单个副本可以由多个事务同时处理。 例如,一个事务可以开始执行应用程序。 当到达 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 类型。
| 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。 |