从 Java 的多线程并行调用非线程安全的 DLL 函数
Call not thread-safe DLL function from Java's multi threads in parallel
虽然我的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++函数不是线程安全的。但如果问题是……我怀疑……
相关文章:
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在std::thread中,joinable()然后join()线程安全吗
- 在c++队列中使用pop和visit实现线程安全
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程安全运算符<<
- 如何使缓存线程安全
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 提升精神 V2 Qi 语法线程安全吗?
- asio 链对象线程安全吗?
- 线程安全队列 c++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 如何以线程安全的方式更改目录?
- 线程安全的引用计数队列C++
- 析构函数和线程安全
- 适用于大型数组的无复制线程安全环形缓冲区