线程安全程序中的非线程安全命令
通过将 CICS® 的程序定义为线程安全程序,您仅指定应用程序逻辑是线程安全的,而不是指定程序中包含的所有 EXEC CICS 命令都是线程安全的。 CICS 可以确保通过切换到 QR TCB 来安全地处理 EXEC CICS 命令,这些命令尚未转换但仍依赖于准重入性的命令。 为了使程序在开放式 TCB 上运行, CICS 需要您保证应用程序逻辑是线程安全的。
在 CICS API 和 SPI 命令主题的命令描述中指示了线程安全且不涉及 TCB 切换的 EXEC CICS 命令。 Threadsafe 命令 和 Threadsafe SPI 命令中也列出了这些命令。
TCB 切换
线程安全程序通过保留在开放式 TCB 上而不是在开放式 TCB 和 QR TCB 之间切换来实现性能优势。 当程序定义为线程安全且正在开放式 TCB 上运行时,在以下情况下会发生从开放式 TCB 到 QR TCB 的 TCB 切换:
- 从任务连接到点 CICS 确定需要开放式 TCB ,对于非 Liberty 事务,所有处理都在 QR TCB 上进行; 对于 Liberty 事务,将使用 T8 TCB。
- 如果程序发出任何非线程安全的 EXEC CICS 命令,那么 CICS 将从开放式 TCB 切换回 QR TCB 以运行非线程安全代码。 如果程序定义为 OPENAPI 或 CONCURRENCY (REQUIRED) ,那么 CICS 将切换回开放式 TCB 以继续运行应用程序逻辑。 如果程序未定义为 OPENAPI 或 CONCURRENCY (REQUIRED) ,那么它将继续在 QR TCB 上运行。 对于 CICS DB2® 应用程序,如果该程序未定义为 OPENAPI 或 CONCURRENCY (REQUIRED) ,并且未发出任何进一步的 DB2 请求,那么切换回 QR TCB 是一个缺点,因为它会在运行任何剩余应用程序代码所花费的时间内增加 QR TCB 的使用率。 但是,如果程序再发出任何 DB2 请求,那么 CICS 必须再次切换回开放式 TCB。
- 如果该程序调用未定义为线程安全的与任务相关的用户出口程序,那么 CICS 将切换回 QR TCB 并对与任务相关的用户出口程序进行控制。 当任务相关的用户出口程序完成处理时,情境与非线程安全的 EXEC CICS 命令后的情境相同 :OPENAPI 或 CONCURRENCY (REQUIRED) 程序切换回开放式 TCB ,并且未定义为 OPENAPI 或 CONCURRENCY (REQUIRED) 的程序继续在 QR TCB 上运行。
- 当程序发出线程安全的 CICS 命令或发出 DB2 请求时,可能会在该命令或请求的处理过程中调用全局用户出口。 如果使用未定义为线程安全的全局用户出口程序,那么 CICS 会切换回 QR TCB 并对全局用户出口程序进行控制。 当用户出口程序完成处理时, CICS 切换回开放式 TCB 以继续处理线程安全的 CICS 命令或完成 DB2 请求。
- 当程序完成时, CICS 将切换回 QR TCB 以进行任务终止。 此开关始终是必需的。