从 Java 的多线程并行调用非线程安全的 DLL 函数
Call not thread-safe DLL function from Java's multi threads in parallel
虽然我的 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 的新内存 space 是通过调用 Native#loadLibrary
分配的,应该避免可重入问题。但是,我的想法可能有问题。
我搜索了从 Java 为 DLL 创建多个内存 space 的正确方法,但找不到它。
How do I call not thread safe C++ function from Java's multi-threads?
你不能。你不能这样做 因为 C++ 函数不是线程安全的1.
I searched correct way to create multiple memory space for DLL from Java, but could not find it.
没有办法做到这一点。 (据我所知)
您的选择是:
将对 C++ 函数的调用限制为单个 Java 线程...或一次一个线程。 (不可接受,在后一种情况下,可能不安全。)
向(每个)运行 调用该函数的 C++ 应用程序启动多个子进程。通过流程管道或使用网络消息、RPC 等传递参数和结果。 (问题是 Java app <--> C++ app 信息传递可能是性能瓶颈。)
重写 C++ 代码使其线程安全。
最后一种方法会给你最好的性能。
1 - 这可能夸大了情况。这可能取决于 为什么 C++ 函数不是线程安全的。但是如果问题是......正如我怀疑的那样......该函数使用静态变量来保存状态,那么情况就像我所说的那样。
虽然我的 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 的新内存 space 是通过调用 Native#loadLibrary
分配的,应该避免可重入问题。但是,我的想法可能有问题。
我搜索了从 Java 为 DLL 创建多个内存 space 的正确方法,但找不到它。
How do I call not thread safe C++ function from Java's multi-threads?
你不能。你不能这样做 因为 C++ 函数不是线程安全的1.
I searched correct way to create multiple memory space for DLL from Java, but could not find it.
没有办法做到这一点。 (据我所知)
您的选择是:
将对 C++ 函数的调用限制为单个 Java 线程...或一次一个线程。 (不可接受,在后一种情况下,可能不安全。)
向(每个)运行 调用该函数的 C++ 应用程序启动多个子进程。通过流程管道或使用网络消息、RPC 等传递参数和结果。 (问题是 Java app <--> C++ app 信息传递可能是性能瓶颈。)
重写 C++ 代码使其线程安全。
最后一种方法会给你最好的性能。
1 - 这可能夸大了情况。这可能取决于 为什么 C++ 函数不是线程安全的。但是如果问题是......正如我怀疑的那样......该函数使用静态变量来保存状态,那么情况就像我所说的那样。