ホームページ  >  記事  >  データベース  >  基于嵌入式SQL和C语言多线程的DB2 workload开发

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

WBOY
WBOYオリジナル
2016-06-07 17:53:541348ブラウズ

本文将系统的介绍基于嵌入式 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. 多线程程序执行流程

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。