And*_*Mao 5 java fortran shared-libraries jna reentrancy
我有一些Java代码调用一些本机代码,最初是用Fortran编写的,使用JNA.(这是一个数值库,很多数学人在Fortran中编写代码.)它被编译成一个.so库,见下文:
在我的代码中测试了所有单元,我得到了很好的结果,但后来我尝试使用来自多个线程的代码,一切都开始失败,出现了奇怪的错误.然后我研究了一些关于重入Fortran代码的东西,并意识到我使用的库有一些全局变量(SAVEFortran中的关键字,当再次调用函数时,它记住变量的值:fortran SAVE语句)
现在我正在用synchronized块包装调用库,但这显着地阻碍了性能.在我看来,重新设计库可能需要付出很大的努力才能重入(它有几千行数字代码,并且不清楚当子程序运行时值如何延续.)有谁知道解决问题的最佳方法是什么?我的想象力表明......
gfortran(gcc)以可重入的方式编译Fortran代码?RECURSIVE关键字,它显然将变量保存在堆栈中,但这似乎与现有代码不兼容.我确认多个虚拟机可以正常运行; 这是有道理的,因为他们不共享记忆.仍然是一个PITA,虽然比线程更不方便.
我不确定每个线程是否都有一个单独的库实例,但是这是我几年前所做的:让操作系统为您提供可重入。
我最终在 Unix 机器上创建了一个应用程序实例池,并使用网络套接字与它们进行通信 - 每个进程都在自己的套接字上侦听。
即使该库不可重入,也可以将其作为单独的进程启动。。。也许您可以围绕该库编写一个瘦 unix 包装器,并通过您自己的专有协议进行通信。
| 归档时间: |
|
| 查看次数: |
976 次 |
| 最近记录: |