精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
有些时候,应用程序必须去调用那些不具备线程安全性的函数,也一些变通的方法,可以安全的调用这些函数。
举例来说,假如有个程序调用和 API 函数foo(), 因为我们已经知道这个函数foo()是不具备线程安全性的,所以必须通过一种安全的方法来调用它。有两种常见的方法:
不过这个方法仅仅只限于调用已知源码的函数,因为我们只能通过互斥体来控制同一时点只有一个线程在调用这个不安全的函数,而如果这个函数中又调用了其它不安全的函数时,就必须要对其它不安全的函数进行控制,这一点在不知道源码时,是无法实现的。
也因为这个原因,所以我们不要试图在自己的程序中,用自已的串行逻辑去控制不具备线程安全性的函数使其达到线程安全性。
另起一个 JOB 来完成我们需要的调用
有几种方法,来完成这个目的:
1、如果应用程序中使用到不具备安全性的 CL 命令,那么可以使用Qp0zSystem()这个函数来调用这些命令,这是一个类似于C 语言里面system()的函数,系统会启动一个启的进程来完成这个CL 命令,并在当前线程中等待CL 命令执行结束并返回(0—成功; 1 – CL 命令不成功; -1--Qp0zSystem()函数执行不成功)。#include <stdio.h>2、如果应用程序中调用了不具备安全性的 API 或程序,可以使用spawn()函数来启一个JOB 去运行。Spawn()函数可以继承原线程中的资源,比如IFS 文件,socket 描述符。
#include <qp0z1170.h>
int main(int argc, char *argv[])
{
if (Qp0zSystem("CRTLIB LIB(XYZ)") != 0)
printf("Error creating library XYZ.\n");
else
printf("Library XYZ created.\n");
return(0);
}
这几乎是最常见的错误。在应用程序之中,需要确保它调用的每一个 API 函数都具备线程的安全性。
要注意 JOBD 中ALWMLTTHD 的值,为*YES 时才可以。
交互式作业不支持多线程。
如果当前 JOB 对应JOBD 不支持多线程,那么将无法运行多线程程序
进程下的一个活动作业组,可能对应多个线程,系统无法安全的关闭活动作业组,所以当线程执行了关闭活动作业组的动作时(比如说C 程序中的exit(),abort()),系统将会结束掉整个进程。
在前面的活动作业组,以及调用 C 程序的注意事项中,已就这个问题进行了应用层的表述。
IBM 要我们不要把pthread 的API 和系统提供的其它线程管理的API 混用,比如说JAVA。
事务处理是 JOB 级,或活动作业组级的。因为我们无法知道,也无法控制线程运行与活动作业组的对应关系,于是事实上,事务处理就不能针对单个线程了。
如果同时有多个线程在进行数据库操作,那一个一个线程的 commit 操作,可能会导致另一个活动中的线程也执行了commit 操作。
于是多线程编程,在实际上就不支持事务处理。