切换到OCIThread多线程编程环境

    多线程的事困扰我好久了, 最初用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遇到了进程间数据共享的问题 ? 是什么问题,能分享下吗?

是我不会写父进程与子进程之间通信的代码. 我只想子进程能修改父进程中的变量值. 不过后来还遇到了OCI的问题, 就拿OCIThread试试了.

OCIThread会让后台进程占用很多的CPU, 因此又要切换回pthread编程方式.

不用OCIThread模式是0.1%, 而用了是0.4-0.5%.

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • Children enter primary school at the age of 7.
  • 孩子们7岁进小学.
  • Some students quit school due to poverty.
  • 一些学生因贫困而辍学.
  • There is fierce competition in the college Entrance Examination.
  • 高考竞争激烈.
  • He majored in Computers.
  • 他主修计算机.
  • She is working for her double major in English and Economics.
  • 她正在修英语和经济双学位.