【问题标题】:Parallel invokation of non reentrant native function using JNA使用 JNA 并行调用不可重入本机函数
【发布时间】:2014-03-20 13:14:21
【问题描述】:

我想并行化对不可重入的本机库 (DLL) 的调用。两个线程应该并行调用本机函数。我想使用 JNA 来访问 DLL。锁不是解决方案,因为这不是并行性。

到目前为止我的想法:

  • 线程池,每个线程持有一个代理实例,指向使用 Native.loadLibrary() 加载的 DLL(它可能仅在 DLL 可以在一个 JVM 中多次加载且不共享任何状态时才有效)

  • 线程池中的线程将每个代理实例保存到其自己的具有不同名称的物理 DLL 中。每个都加载了 Native.loadLibrary()。 (可能只有在同一个库接口可以加载多个DLL的情况下才有效)

  • 我是否需要在不同的 JVM 中加载 DLL 以实现并行性。

有谁知道这些想法之一是否可行/或为什么它行不通。其他建议? 谢谢,马丁

【问题讨论】:

  • 您需要尽可能多的 DLL 副本以实现并行性,每个副本都以唯一的名称加载。这假设库本身在这种用法下不会窒息。

标签: java dll jvm jna


【解决方案1】:

在 Windows 上,您不能将同一个 DLL 两次加载到一个进程中。我说实现并行性的最佳选择是让多个进程同时执行,而不是一个进程。

【讨论】:

  • 你也不能在 Linux 上,而且我不希望任何操作系统会允许它。 DLL/SO 通过绑定到方法调用的跳转表工作。这些绑定不是线程本地的。
  • 物理上不同的 DLL 怎么样。基本上复制DLL并重命名它。这会创建新的跳转表到不同的地址吗?如果是,我可以使用相同的 JNA 库接口访问这两个库吗?还是 JNA 有限制?
  • 如果你有 8 个核心呢?你会重命名 DLL 16 次吗?
  • 我承认,这不是一个优雅的解决方案,但是是的,我可能会将它作为临时解决方案......如果它有效的话。
  • 我不敢称其为解决方案。如果以这种方式使用,库可能会严重崩溃。运行多个进程更直接、更可扩展,也是一种非常常见的技术。就用那个吧。
猜你喜欢
  • 2011-10-19
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多