从 Java 的多线程并行调用非线程安全的 DLL 函数

Call not thread-safe DLL function from Java's multi threads in parallel

本文关键字:线程 安全 DLL 函数 调用 Java 多线程 并行      更新时间:2023-10-16

虽然我的c++程序显然不是线程安全的,但我需要从Java的多个并行线程中调用它。由于性能问题,我无法重写c++代码,需要执行通过并行编译c++程序创建的DLL

我如何从Java的多线程调用不线程安全的c++函数?

我所尝试的是使用JNA和调用Native#loadLibrary每次当一个线程调用DLL函数。但是,它没有解决问题,出现了分割故障。

public static class MyRunnable implements Runnable{
  ...
  public void run(){
    MyCLibrary INSTANCE = (MyCLibrary)Native.loadLibrary(MyCLibrary.JNA_LIBRARY_NAME, MyCLibrary.class);
    INSTANCE.cfunc()
  }  
  ...
}

我认为DLL的新内存空间是通过调用Native#loadLibrary来分配的,应该避免重入问题。但是,我的想法可能是错误的。

我搜索了正确的方法来创建多个内存空间的DLL从Java,但无法找到它。

我如何从Java的多线程调用不线程安全的c++函数?

你不能。你不能这样做,因为 c++函数不是线程安全的1

我搜索了正确的方法来创建多个内存空间的DLL从Java,但无法找到它。

没有办法那样做。(AFAIK)

你的选择是:

  • 限制对c++函数的调用到单个Java线程…或者一次一个线程。(不可接受,后一种情况下,可能不安全)

  • 启动多个子进程(每个子进程)运行调用该函数的c++应用程序。通过进程管道或使用网络消息、RPC等传递参数和结果。(问题是Java应用程序<-> c++应用程序的信息传递可能成为性能瓶颈。)

  • 重写c++代码使其线程安全

最后一种方法会给你最好的性能。


1 -这可能夸大了情况。这可能取决于为什么 c++函数不是线程安全的。但如果问题是……我怀疑……

如果函数使用静态变量来保存状态,则情况与I状态相同。