虽然我的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创建多个内存空间,但找不到它。
答案 0 :(得分:1)
如何从Java的多线程调用不是线程安全的C ++函数?
你做不到。你不能这样做因为 C ++函数不是线程安全的 1 。
我搜索了正确的方法,从Java为DLL创建多个内存空间,但找不到它。
没有办法做到这一点。 (AFAIK)
您的选择是:
将对C ++函数的调用限制为单个Java线程...或一次一个线程。 (不可接受,在后一种情况下,可能不安全。)
启动多个子进程以(每个)运行一个调用该函数的C ++应用程序。通过流程管道或使用网络消息,RPC等传递参数和结果。 (问题是Java应用程序< - > C ++应用程序信息传递可能是性能瓶颈。)
重写C ++代码以使其成为线程安全的。
最后一种方法将为您提供最佳性能。
1 - 这可能夸大了案例。它可能取决于为什么 C ++函数不是线程安全的。但如果问题是......我怀疑......函数使用静态变量来保持状态,那么情况就像我说的那样。