linux下多线程的proc编程问题?
我在linux上起一个进程,进程内起2个线程,每个线程通过使用oracle提供的线程保护机制创建了各自的数据库连接环境(context),对数据库的操作可以互不影响。现在的问题是sqlca这个结构是全局的,2个线程操作数据库后都会去修改这个结构,导致了在线程内部没法通过检查sqlca.sqlcode的值来判断本次操作的成功与否,例如a线程检查到的sqlca.sqlcode值也许是b线程操作数据库的结果。到底有没有办法使得线程访问到的sqlca结构总是这个线程上次操作数据库的结果呢?
与大家共勉。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你可以参考一下下面这段代码,也许对你有帮助
main()
{
......................
EXEC SQL ENABLE THREADS;
EXEC SQL WHENEVER SQLERROR DO err_report(sqlca);
....................................
#ifdef DCE_THREADS
;
if (pthread_create(&thread_id,pthread_attr_default,
(pthread_startroutine_t)do_transaction,
(pthread_addr_t) ¶ms))
#else
if (status = thr_create
(NULL, 0, do_transaction, ¶ms, 0, &thread_id))
#endif
printf("Cant create thread %dn",i);
else
printf("Createdn"
........................................
}
#ifdef DCE_THREADS
void do_transaction(params)
#else
void *do_transaction(params)
#endif
parameters *params;
{
struct sqlca sqlca;
record_log *trx;
sql_context ctx=params->;ctx;
/* Done all transactions ? */
while (trx_nr < (sizeof(records)/sizeof(record_log)))
{
get_transaction(&trx);
EXEC SQL WHENEVER SQLERROR DO err_report(sqlca);
EXEC SQL CONTEXT USE :ctx;
...................................
}
这是oracle文档中的一段代码,他在线程执行函数中又重新定义了一个sqlca变量