线程安全程序
在 CICS® 开放式事务环境 (OTE) 中,当将应用程序,任务相关的用户出口 (TRUEs) ,全局用户出口程序和用户可替换模块定义为线程安全的 CICS 时,它们可以在 OTE 中的开放式 TCB 上并发运行。
访问开放式事务环境
涉及使用 ENABLE PROGRAM 命令上的 OPENAPI 选项启用的任务相关用户出口 (TRUE) 的应用程序将自动涉及开放式事务环境。 这些应用程序可以从线程安全中获得性能优势。 访问 Db2 资源的 CICS 应用程序所使用的 CICS Db2® 任务相关用户出口是开放式 API TRUE ,因此 CICS Db2 应用程序可以从线程安全中获取性能优势。 有关 CICS Db2 应用程序的线程安全编程的更多详细信息,请参阅 通过线程安全编程使 CICS Db2 应用程序能够使用开放式事务环境 (OTE)。
对于其他用户应用程序, PLT 程序,用户可替换模块或与任务相关的用户出口,您可以选择使用开放式事务环境,方法是将它们定义为 OPENAPI 程序,在这种情况下,它们必须是线程安全的。 有关 OPENAPI 程序线程安全编程的更多详情,请参阅什么是 OPENAPI 程序?
如果将程序定义为 CONCURRENCY (REQUIRED) ,那么它始终在开放式 TCB 上运行。 使用的开放式 TCB 类型取决于 API 设置。 对于 CICSAPI 程序, CICS 使用 L8 开放式 TCB ,而不考虑程序的执行键。 对于 OPENAPI 程序,如果设置了 EXECKEY (USER) ,那么 CICS 将使用 L9 TCB ,如果设置了 EXECKEY ( CICS ) ,那么将使用 L8 TCB 设置。 REQUIRED 适用于用户应用程序, PLT 程序和用户可替换模块。 对于全局用户出口程序和与任务相关的用户出口程序,如果指定 CONCURRENCY (REQUIRED) ,那么 $TAG1 CICS $TAG2 会将该程序视为已指定 CONCURRENCY (THREADSAFE)。
不能将全局用户出口定义为 OPENAPI 程序,但是如果对全局用户出口使用 ENABLE PROGRAM 命令的 THREADSAFE 选项,那么它将作为线程安全程序启用,并且可以在与使用它的应用程序相同的开放式 TCB 上运行。 如果 ENABLE PROGRAM 命令未指定 CONCURRENCY 或 API 选项,那么将使用程序定义上的选项。
序列化方法
在开放式 TCB 上运行的应用程序不能依赖于准重入来防止共享资源被其他程序并行访问。 此外,如果准重入程序访问也可由在开放式 TCB 下并发运行的用户任务访问的共享资源,那么准重入程序也可能面临风险。 因此,用户程序用于访问共享资源的方法必须考虑其他程序同时访问的可能性。
要获取开放式事务环境的性能优势,同时保持共享资源的完整性,必须使用序列化技术来禁止对共享资源的并发访问。 在访问共享资源时使用相应序列化方法的程序描述为线程安全。
对于大多数资源 (例如文件,瞬时数据队列,临时存储器队列和 Db2 表) , CICS 处理会自动确保以线程安全方式进行访问。 对这些资源运行的某些 CICS 命令进行了编码,以使用相应的序列化方法,这些方法允许它们在打开的 TCB 上运行; 即,它们是线程安全的命令。 在情况并非如此的情况下, CICS 通过强制切换到 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 以进行任务终止。 此开关始终是必需的。
如果应用程序混合了线程安全程序和非线程安全程序
如果一个或多个程序不是线程安全的,那么使用定义为线程安全的程序 (例如,在 CICS Db2 应用程序中) 运行应用程序可能会导致问题。 如果发生这种情况,那么可以使用 FORCEQR 系统初始化参数将所有应用程序强制连接到 QR TCB。 这在生产区域中很有用,在生产区域中,您无法在调查问题时让应用程序退出服务。
此参数的缺省值为 FORCEQR=NO ,这表示 CICS 采用程序资源定义上的 CONCURRENCY 属性。 作为临时措施,当您调查并解决与线程安全定义的程序相关的问题时,可以设置 FORCEQR=YES。 当您准备好程序在 OTE 下恢复使用开放式 TCB 时,请记住将此更改回 FORCEQR=NO。