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

时间:2015-05-31 00:04:43

标签: java c++ multithreading dll

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

如何从Java的多线程中调用不是线程安全的C ++函数?

我每次尝试使用JNA并在每次线程调用DLL函数时调用Native#loadLibrary。但是,它没有解决问题并且发生了分段错误。

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来分配的,应该避免重入问题。但是,我的想法可能是错误的。

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

1 个答案:

答案 0 :(得分:1)

  

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

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

  

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

没有办法做到这一点。 (AFAIK)

您的选择是:

  • 将对C ++函数的调用限制为单个Java线程...或一次一个线程。 (不可接受,在后一种情况下,可能不安全。)

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

  • 重写C ++代码以使其成为线程安全的。

最后一种方法将为您提供最佳性能。

1 - 这可能夸大了案例。它可能取决于为什么 C ++函数不是线程安全的。但如果问题是......我怀疑......函数使用静态变量来保持状态,那么情况就像我说的那样。