开发者社区> 问答> 正文

JNA调用Fortran编写的动态链接库DLL(或so),如何实现多用户并发使用dll?

import com.sun.jna.NativeLibrary;
public class CallFortranDLL {
public void FotranRunModel(String userworkPath, int pathLen) {
try {

        NativeLibrary instance = null;
       instance = NativeLibrary.getInstance("XXX.dll");

instance.getFunction("Model2DRun").invokeInt(new Object[]{userworkPath, pathLen});
instance.dispose();
} catch (Exception e) {
e.printStackTrace();
}
}
}

以上是调用dll的类,dll中的函数Model2DRun是执行一项复杂耗时的计算。
在webAPI接口中通过userID参数来选择选择计算所需的输入输出文件路径,设想通过这样可以让不同的用户调用该接口时在预设的用户文件夹中完成计算。
问题是,当用户1正在进行计算,此时用户2又发起来了对该方法的请求,则会导致用户1的计算异常。
如果用户1已经完成了计算,用户2再做计算,则会正常进行。
对于上述存在的问题, public void FotranRunModel改为public static synchronized void FotranRunModel则可以实现顺利计算,但明显不是并发的,而是让用户2在等待用户1的计算完成后才执行2的请求,这样的做法对于用户过多的情况明显是不合适的。
另外,还测试了将dll在各用户的文件夹中均复制一份,然后NativeLibrary.getInstance("XXX.dll");修改为加载各用户文件夹中的dll,也是没用的,也会导致数据混乱,计算异常,甚至将dll复制后改为与用户相关的名字,也就是说调用多个dll,也不行,仍然是数据混乱,没法正常计算。
那么有没有什么合适的方法处理上述问题?

展开
收起
游客4dlaiodsmcwm6 2024-06-10 09:04:14 26 0
0 条回答
写回答
取消 提交回答
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载