我正在使用一个不可重入的库(用 C 编写)(即库中没有函数是可重入的)。假设我已经通过 System.load 加载了库以获取句柄“v”。由于重入问题,我无法在两个线程中使用 v (尝试过但结果毫无意义)。我可以使用锁,但这会破坏我可以获得的任何并行性。
我想做的是启动两个线程,并在每个线程中加载库以获取两个不同的句柄(因此有加载的库的两个副本)。
这在 Java 中可能吗? 问候 萨普塔什
这是不可能的。 这相当于使用 POSIX
dlopen
等将 C / C++ 库的多个副本动态加载到 C / C++ 程序中,但这也不起作用。
您的主要选择是:
修改C库使其线程安全
用(线程安全)Java 重新编码它
将其包装为应用程序并作为单独的进程运行多个副本
将其包装为服务并运行多个副本,使用普通套接字、HTTP 或适当的高级 RPC 机制与其通信。
任何 DLL 只能被一个进程加载一次,所以我认为你无法实现你想要的。您可以作弊并将 DLL 重命名为其他名称吗?
您的线程在 DLL 中花费了如此多的时间,以至于没有其他并行性?
这似乎不可能。
System.loadLibrary
方法没有任何参数或文档表明您可以以特定于线程的方式加载库或加载同一库两次。
如果您有特定数量的线程,您可以创建多个命名方案略有不同的库。 否则,您可能应该只实现锁。