多线程的事困扰我好久了, 最初用fork遇到了进程间数据共享的问题, 改成vfork则主进程要等子进程结束后才继续. 后成改成用POSIX的线程(pthread)来写, 结果跑了一天, 我的OCI程序挂起了, 原因是遇到了一个Bug. 今天在网上搜索后发OCIThread, 就是Oracle包装了一层之后的多线程编程环境了. 将程序改了一下, 希望周一来时它没有挂住.
OCIThread要求在其他的OCIThread调用之前先执行如下调用:
OCIThreadProcessInit();
然后以OCI_THREADED方式创建OCIEnv对象, 并执行OCIThread初始化:
OCIThreadInit(seshp,errhp);
接下来就可以创建OCI线程了, 使用下面的调用:
OCIThreadCreate(seshp, errhp, mycall, (dvoid *)param, NULL,NULL);
当被调用的函数执行完后, 线程就自动退出了. 当然在断开连接之前得结束OCIThread, 执行如下调用:
OCIThreadTerm(seshp,errhp);
在Windows上和Linux编译好后, 都直接支持多线程模式. 而在Solaris上则在编译是要加上"-lpthread"才能创建线程, 一开始没有加, 怎么都不能创建线程, 以为是Oracle不支持呢. 还好最后灵光突现, 加上这个, 程序正在以多线程模式跑着呢.
留言 (3)
最初用fork遇到了进程间数据共享的问题 ? 是什么问题,能分享下吗?
Posted by tosimple | Aug 12, 2007 10:43 AM
是我不会写父进程与子进程之间通信的代码. 我只想子进程能修改父进程中的变量值. 不过后来还遇到了OCI的问题, 就拿OCIThread试试了.
Posted by anysql | Aug 12, 2007 12:44 PM
OCIThread会让后台进程占用很多的CPU, 因此又要切换回pthread编程方式.
不用OCIThread模式是0.1%, 而用了是0.4-0.5%.
Posted by anysql | Aug 14, 2007 11:42 PM