欢迎来到天天文库
浏览记录
ID:11653787
大小:33.50 KB
页数:7页
时间:2018-07-13
《用proc开发多线程应用程序-数据库专家》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、用Pro*C开发多线程应用程序-数据库专家代码:(注:本文来自Pro*C/C++PrecompilerProgrammer'sGuideRelease8.1.5) 如果你的操作系统不支持线程,本文暂不适合你。本文包含以下几个部分: n什么是多线程? nPro*C中的运行时上下文 n运行时上下文的使用模式 n多线程应用程序的用户接口 n多线程例子 一.什么是多线程? 一个多线程的应用程序中,线程运行在共享的地址空间里。线程是在进程内部执行的“轻量”级子进
2、程,它们共享代码段和数据段,但是有自己的程序计数器、寄存器和堆栈。全局变量和静态变量在线程之间是共享的,因此通常需要在程序中使用某种互斥机制来管理线程对这些变量的访问,互斥体Mutexes就是用来保证数据完整性的同步装置。 有关互斥体的更多讨论,参看多线程编程方面的文章。 Proc*C编译器通过以下方式支持开发多线程的Oracle应用程序(在支持线程的平台上): n用一个命令行编译选项来产生线程安全的代码 n用内嵌的SQL语句和指令支持多线程 n线程安全的Lib库和其他客
3、户端Lib库 注意:也许你的平台支持某个特殊的线程包,但还是需要查看Oracle有关平台的文档,看看Oracle是否支持它。 二.Pro*C中的运行时上下文 为了在线程和数据库连接之间建立松散的结合,Pro*C引入了一个概念runtime_context,我们称之为运行时上下文。一个运行时上下文包含了以下资源和信息: n与数据库服务器的连接 n当前连接上使用的游标 n内嵌的一些选项,如MODE,HOLD_CURSOR,RELEASE_CURSOR和SELECT_ERR
4、OR 不仅仅是简单的支持线程和连接之间的松散结合,Pro*C编译器还允许开发人员在线程和运行时上下文之间建立松散的结合,Pro*C允许在程序里为运行时上下文定义一个句柄,通过这个句柄,运行时上下文可以在线程之间切换。 例如,一个交互式应用程序创建了线程T1,来执行一个查询,并且返回了前10条记录,然后T1终止。在用户输入了必须的数据之后,程序又创建了线程T2,并且把T1使用的运行时上下文传给T2,这样T2可以在同一个游标上获取接下来10条的记录。 三.运行时上下文的使用模式 下面是在
5、多线程的Pro*C程序中使用运行时上下文的两种可能模式: n多线程共享单个运行时上下文 n多线程使用互相独立的运行时上下文 不管采用哪种模式,不能在同一时刻多个线程共享同一个运行时上下文。如果两个或两个以上的线程在同一时刻试图使用同一个运行时上下文,将会出现以下错误:SQL-02131:Runtimecontextinuse。 1.多线程共享单个运行时上下文 2.多线程使用互相独立的运行时上下文 四.多线程应用程序的用户接口 Pro*C编译器提供以下接口来支持
6、多线程: n命令行选项,THREADS=YES
7、NO n内嵌SQL语句和指令 n线程安全的公共库函数 1.THREADS选项 在proc预编译命令行上指定THREADS=YES,Pro*C编译器将保证产生的C代码是线程安全的。如果指定了THREADS=YES,Pro*C将会检查每个包含SQL执行语句的函数,是否指定了这些语句是在哪个运行时上下文中执行的,若没有发现这类指定标识,编译器就会返回错误。 2.内嵌SQL语句和指令 下列内嵌的SQL语句和指令用于支持多线程
8、和运行时上下文的使用: nEXECSQLENABLETHREADS; nEXECSQLCONTEXTALLOCATE:context_var; nEXECSQLCONTEXTUSE{:context_var/DEFAULT}; nEXECSQLCONTEXTFREE:context_var; 在以上SQL语句中,context_var是运行时上下文句柄,它必须被定义成sql_context类型:如sql_contextcontext_var; 使用DEFAULT意
9、味着接下来的SQL语句将使用默认的全局运行时上下文,直到另一条CONTEXTUSE语句覆盖它。 nEXECSQLENABLETHREADS 这条可执行SQL语句初始化支持多线程的进程。它必须是程序中第一条可执行的SQL语句。 nEXECSQLCONTEXTALLOCATE 这条可执行SQL语句分配并初始化了一块用于指向一个新的运行时上下文的内存,并返回标
此文档下载收益归作者所有