欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

基于嵌入式SQL和C语言多线程的DB2 workload开发

程序员文章站 2022-04-01 19:59:49
...

本文将系统的介绍基于嵌入式 SQL 和 C 语言多线程的 DB2 workload 开发的流程,并提供详细的程序示例清单。通过本文对 C 语言多线程的深入介绍和对构建支持多线程访问的嵌入式 SQL 上下文环境的分析,读者可以快速的掌握这种 DB2 workload 的开发方法,创建高

由于程序示例代码的重用性较高,可以大大的提高需要使用这种 DB2 workload 的软件自动化测试人员,使用 C 语言多线程访问 DB2 的软件开发人员的工作效率。

众所周知,在使用 DB2 的实际生产环境中, 我们会遇到各种各样的应用,例如基于不同的开发语言,基于不同的体系架构或者基于不同的连接方式等等。针对这些不同的 workload, 我们从事 DB2 性能监控工具测试工作的软件人员,必须开发一些相对应的 workload 去模拟这些生产环境,才能得到较为合理的测试结果,更多的发现 DB2 性能监控工具存在的潜在问题。

查看了很多 DB2 上运行的 workload 介绍,发现基于嵌入式 SQL 和 C 语言多线程的 workload 相对较少,针对这种情况,本文在系统分析了 C 语言多线程技术和构建支持多线程访问的嵌入式 SQL 上下文环境的基础上,提出并详细介绍了基于嵌入式 SQL 和 C 语言多线程的 DB2 workload 的开发流程,最后使用了一个具体的代码实例详细的演示了这个开发流程。

C 语言多线程介绍

一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。进程是由多个线程所组成的。线程是程序中的一个执行流,每个线程都有自己的专有寄存器 ( 栈指针、程序计数器等 ),但代码区是共享的,即不同的线程可以执行同样的函数和代码段。多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

C 语言最初并未设计多线程的机制,由于随着软硬件的发展及需求的扩展,C 语言才开发了线程库以支持多线程的操作、应用。本文主要介绍 Linux 下的 C 语言多线程, Linux 系统下的 C 语言多线程遵循 POSIX 线程接口,称为 pthread。Linux 下 pthread 的实现是通过系统调用 clone() 来实现的。Clone() 是 Linux 所特有的系统调用。编写 Linux 下的 C 语言多线程程序,需要使用头文件"pthread.h",连接时需要使用库 libpthread.a。因此,必须在编译中加入 -lpthread 选项,否则提示找不到 pthread_create() 等相关的多线程函数。下面将详细的介绍一些重要的 Linux 下 C 语言多线程程序调用的 API。

线程的创建:

int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict attr,
 void *(*start_rtn)(void),void *restrict arg);
  • 创建线程成功时,函数返回 0,若不为 0 则说明创建线程失败,常见的错误返回代码为 EAGAIN 和 EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。
  • 第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。

线程的挂起和退出:

int pthread_join(pthread_t thread, void **value_ptr);
  • 该函数的作用使得当前线程挂起,等待另一个线程返回才继续执行,也就是说当程序运行到这个地方时,程序会先停止,然后等线程 id 为 thread 的这个线程返回,然后程序才会断续执行。
  • 第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。
 void pthread_exit(void *rval_ptr);
  • 一个线程的结束有两种途径,一种是函数结束了,调用它的线程也就结束了;另一种方式是通过调用函数 pthread_exit 来实现。
  • 唯一的参数是函数的返回代码。

线程间的互斥锁:

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr_t* attr);
  • 互斥锁初始化:第一个参数是互斥锁变量指针,第二个参数是互斥锁属性,传入 NULL 使用默认属性。
int pthread_mutex_lock(pthread_mutex_t *mutex);
  • 互斥锁锁定:唯一参数是互斥锁变量指针。如果互斥锁已经被锁定,当前线程将被阻塞,直到,其他线程对互斥锁解锁。
int pthread_mutex_unlock(pthread_mutex_t *mutex);
  • 互斥锁解锁:唯一的参数是互斥锁变量指针。如果当前线程拥有参数 mutex 所指定的互斥锁,该调用将该互斥锁解锁。

Linux 系统下的 C 语言多线程程序的执行流程如下:

图 1. 多线程程序执行流程

基于嵌入式SQL和C语言多线程的DB2 workload开发
采用了 C 语言多线程技术的应用程序可以更好地利用系统资源,其主要优势在于充分利用了 CPU 的空闲时间片,可以用尽可能少的时间来对用户的要求做出响应,既使得进程的整体运行效率得到较大提高,又同时增强了应用程序的灵活性。