用ProC开发多线程应用程序

上传人:lis****210 文档编号:171355428 上传时间:2022-11-26 格式:DOCX 页数:7 大小:12.78KB
收藏 版权申诉 举报 下载
用ProC开发多线程应用程序_第1页
第1页 / 共7页
用ProC开发多线程应用程序_第2页
第2页 / 共7页
用ProC开发多线程应用程序_第3页
第3页 / 共7页
资源描述:

《用ProC开发多线程应用程序》由会员分享,可在线阅读,更多相关《用ProC开发多线程应用程序(7页珍藏版)》请在装配图网上搜索。

1、用 Pro*C 开发多线程应用程序 - 数据库专家代码:t 西t Jhread. pcMakefile( 注 :本 文来自 Pro*C/C+ Precompiler Programmers Guide Release 8.1.5 )如果 你的 操作 系统 不支 持线程 ,本 文暂 不适 合你 。本文 包含 以下 几个 部分 :n 什么是 多线 程?n Pro*C 中的 运行 时上 下文n 运行时 上下 文的 使用 模式n 多线程 应用 程序 的用 户接 口n 多线程 例子一什么是多线程?一个多线程的应用程序中,线程 运行在共享的地 址空 间里。线程是在进程内部执行 的“轻量”级子进程,它们 共

2、享代码段和数据段,但是 有自己的程 序计 数器、寄 存器和 堆栈。全 局变 量和静 态变 量在线 程之 间是 共享的 ,因 此通常 需要 在程 序中使 用某 种互 斥 机制来管 理线 程对 这些 变量 的访问 ,互斥体 Mutexes 就是用 来保 证数据 完整 性的 同步 装有关 互斥 体的 更多 讨论 ,参看 多线 程编 程方 面的 文章。Proc*C 编译器通过以下方式 支持开发多线程的 Oracle 应用程序(在支持线程的平台 上):n 用一个命令行编译选项来产生线 程安全的代码n 用内嵌的 SQL 语句和 指令 支持多 线程n 线程安 全的 Lib 库和 其他 客户端 Lib 库注意

3、:也许你的平台 支持某个特殊的线程包,但还是需要查看 Oracle 有关平台的 文 档,看看 Oracle 是否 支持它。二. Pro*C中的运行时上下文为 了 在 线 程 和 数 据 库 连 接 之 间 建 立 松 散 的 结 合 , Pro*C 引 入 了 一 个 概 念runtime_context ,我们称之为运行时上下文。一个运行时上 下文 包含了以下资源 和信息:n 与数据 库服 务器 的连 接n 当前连 接上 使用 的游 标n 内嵌的一些选项,如 MODE ,HOLD_CURSOR ,RELEASE_CURSOR 和 SELECT_ERROR不仅 仅是 简单的 支持 线程和 连接

4、 之间 的松散 结合 ,Pro*C 编译器 还允许 开发 人员 在 线程和运 行时 上下文 之间 建立松 散的 结合 ,Pro*C 允许在 程序里 为运 行时上 下文 定义 一 个句柄,通过这个句柄,运行时上下文可以在线程之间切换 。例如,一个交互式应用程序创建了线程T1,来执行一个查询,并且返回了前10条 记录,然后T1终止。在用户输入了必须的数据之后,程序又创建了线程T2,并且把T1 使用的运行时上下文传给T2,这样T2可以在同一个游标上获取接下来10条的记录。三运行时上下文的使用模式下面是在多线程的 Pro*C 程序中使用运行时上下文的两种可能模式:n 多线程共享单个运行时上下文n 多线

5、程使用互相独立的运行时上下文不管采用哪种模式, 不能在同一时刻多个线程共享同一个运行时上下文。如果两个 或两个以上的线程在同一时刻试图使用同一个运行时上下文, 将会出现以下错误: SQL-02131: Runtime context in use 。1多线程共享单个运行时上下文2多线程使用互相独立的运行时上下文四多线程应用程序的用户接口Pro*C 编译器提供以下接口来支持多线程:n 命令行 选项 , THREADS=YES|NOn 内嵌 SQL 语 句和 指令n 线 程安 全的 公共 库函 数1THREADS 选 项在proc预编译命令行上指定THREADS=YES,Pro*C编译器将保证产生

6、的C代码是线 程安全的。如果指定了 THREADS=YES, Pro*C将会检查每个包含SQL执行语句的函数, 是否指定了这些语句是在哪个运行时上下文中执行的, 若没有发现这类指定标识,编译器就会返 回错 误。2内嵌 SQL 语句和 指令 下列内嵌的 SQL 语句和指令用于支持多线程和运行时上下文的使用:n EXEC SQL ENABLE THREADS ;n EXEC SQL CONTEXT ALLOCATE :context_var ;n EXEC SQL CONTEXT USE :context_var/DEFAULT ;n EXEC SQL CONTEXT FREE :context_

7、var ;在以上SQL语句中,con text _var是运行时上下文句柄,它必须被定义成sql_con text 类 型 :如 sql_context context_var ;使用 DEFAULT 意味着接下来的 SQL 语句将使用默认的全局运行时上下文,直到另一 条 CONTEXT USE 语句覆盖它。n EXEC S QL ENABLE THREADS这条可执行SQL语句初始化支持多线程的进程。它必须是程序中第一条可执行的SQL 语句。n EXEC SQL CONTEXT ALLOCATE这条可执行 SQL 语句分配并初始化了一块用于指向一个新的运行时上下文的内存, 并返回标 识该 上

8、下 文的 句柄 变量, 该变 量必 须声 明为 sql_context 类型。n EXEC SQL CONTEXT USE这条指令性语句告诉编译器接下去执行的 SQL 语句将使用指定的运行时上下文, 这 里的运行时上下文必须在此前已经用 CONTEXT ALLOCATE 分配并初始化。n EXEC SQL CONTEXT FREE这条语句释放了运行时上下文句柄指定的内存, 并把它设置空值。3编程时要考虑的问题尽管 Oracle 保证 SQL 库是线程安全的,但是你还是有责任保证你的 Pro*C 代码是为 能在多线程下正确运行而设计的, 例如,你必须考虑全局变量和静态变量的。另外,多线程要求对以

9、下问题进行考虑:n 把 sqlca 结构 定义 成线 程安全 的。 典型 的做 法是 在每个 函数 开始 定义 一个 同名 的 局部变量。n sqlda 结 构也和 sqlca 结构 一 样处 理。n 把程序里的宿主变量定义成线程 安全的。也就是说要小心处理程序里的全局变量 和 静 态变 量。n 避免同 一时 刻不 同线 程使 用同一 个运 行时 上下 文。五多线程例子下面 的例 子运 行在 Red Hat9 和 Oracle9 上。程序目 的是用 两个 线程 同时 往一 个表 里 插 10000 条记 录, 每个 线程 都拥有 自己 的运 行时 上下 文。#include#include#i

10、nclude /* Linux 线程 库头 文 件 */#include sqlca.h /* Oracle 头文 件 */#define SQLCODE sqlca.sqlcodestatic int insert_data( sql_context );static int start();intmain()pthread_t tid1, tid2;/* 创建两 个线程 */if( pthread_create( &tid1,NULL,(void *)start,NULL ) )printf(创建线程失败!n);exit(1);if( p thread_create( &tid2,NULL

11、,(void *)start,NULL ) )printf(创建线程失败!n);exit(1);/* 等待线 程退出 */if( pthread_join( tid1,NULL ) )printf(等待线程结束失败!n);exit(1);if( pthread_join( tid2,NULL ) )printf(等待线程结束失败!n);exit(1);exit(0);intstart()sql_context context;struct sqlca sqlca; /* 需要 在此 定义 一个局 部的 sqlca */char uid = dev/888888;/* 以下 SQL 语句的执行顺

12、序不 能更 改 */EXEC SQL ENABLE THREADS;EXEC SQL CONTEXT ALLOCATE :context;EXEC SQL CONTEXT USE :context;EXEC SQL CONNECT :uid;if( SQLCODE 0 )printf(创建数据库连接失败,d:%sn, SQLCODE,sqlca.sqlerrm.sqlerrmc);return -1;insert_data( context );EXEC SQL COMMIT WORK RELEASE;if( SQLCODE 0 )printf( 断开数 据库 连接 失败 !%d:%sn, S

13、QLCODE,sqlca.sqlerrm.sqlerrmc ); return -1;EXEC SQL CONTEXT FREE :context;return 0;static intinsert_data( context )sql_context context;struct sqlca sqlca; /* 需要 在此定义一个局部的 sqlca */char name11;int age;int i;strcpy( name, test );age = 20;EXEC SQL CONTEXT USE :context; /* 指定 执行 SQL 语句的 上下 文 */ for( i=0; i10000; i+ )EXEC SQL INSERT INTO table1 VALUES ( :name, :age );if( SQLCODE 0 )printf(插入纪 录失败!d:%s n, SQLCODE, sqlca.sqlerrm.sqlerrmc ); return -1;return 0;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!