锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / 调用不具备线程安全性的函数、多线程错误
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

调用不具备线程安全性的函数、多线程错误

调用不具备线程安全性的函数

有些时候,应用程序必须去调用那些不具备线程安全性的函数,也一些变通的方法,可以安全的调用这些函数。

举例来说,假如有个程序调用和 API 函数foo(), 因为我们已经知道这个函数foo()是不具备线程安全性的,所以必须通过一种安全的方法来调用它。有两种常见的方法:

通过互斥体的控制,来调用这个函数;

不过这个方法仅仅只限于调用已知源码的函数,因为我们只能通过互斥体来控制同一时点只有一个线程在调用这个不安全的函数,而如果这个函数中又调用了其它不安全的函数时,就必须要对其它不安全的函数进行控制,这一点在不知道源码时,是无法实现的。

也因为这个原因,所以我们不要试图在自己的程序中,用自已的串行逻辑去控制不具备线程安全性的函数使其达到线程安全性。

另起一个 JOB 来完成我们需要的调用

有几种方法,来完成这个目的:

1、如果应用程序中使用到不具备安全性的 CL 命令,那么可以使用Qp0zSystem()这个函数来调用这些命令,这是一个类似于C 语言里面system()的函数,系统会启动一个启的进程来完成这个CL 命令,并在当前线程中等待CL 命令执行结束并返回(0—成功; 1 – CL 命令不成功; -1--Qp0zSystem()函数执行不成功)。
例:
  #include <stdio.h>
#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);
}
2、如果应用程序中调用了不具备安全性的 API 或程序,可以使用spawn()函数来启一个JOB 去运行。Spawn()函数可以继承原线程中的资源,比如IFS 文件,socket 描述符。
3、如果应用程序频繁的调用了不具备安全性的多个函数,那么可以考虑通过上述方法,启动一个新JOB,专门去运行这些函数。JOB 之间可以通过消息队列,数据队列进行通讯。

常见的多线程错误

在多线程编程中,常见的错误有以下几种:

调用不具备线程安全性的函数

这几乎是最常见的错误。在应用程序之中,需要确保它调用的每一个 API 函数都具备线程的安全性。

当前 JOB 不允许创建多线程

要注意 JOBD 中ALWMLTTHD 的值,为*YES 时才可以。

交互式作业不支持多线程。

如果当前 JOB 对应JOBD 不支持多线程,那么将无法运行多线程程序

关闭活动作业组

进程下的一个活动作业组,可能对应多个线程,系统无法安全的关闭活动作业组,所以当线程执行了关闭活动作业组的动作时(比如说C 程序中的exit(),abort()),系统将会结束掉整个进程。

在前面的活动作业组,以及调用 C 程序的注意事项中,已就这个问题进行了应用层的表述。

混合使用线程API

IBM 要我们不要把pthread 的API 和系统提供的其它线程管理的API 混用,比如说JAVA。

事务处理

事务处理是 JOB 级,或活动作业组级的。因为我们无法知道,也无法控制线程运行与活动作业组的对应关系,于是事实上,事务处理就不能针对单个线程了。

如果同时有多个线程在进行数据库操作,那一个一个线程的 commit 操作,可能会导致另一个活动中的线程也执行了commit 操作。

于是多线程编程,在实际上就不支持事务处理。

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内