2010-01-11 44 views
4

我正在使用不可重入的庫(用C語言編寫)(即庫中沒有函數是可重入的)。假設我已經通過System.load加載了庫來獲取句柄'v'。由於重入問題,我無法在兩個線程中使用v(嘗試過但無稽之談)。我可以使用鎖,但是這會破壞我可能獲得的任何並行性。Java:在兩個線程中加載相同的動態庫(兩個線程都在同一個JVM中)

我想要做的是啓動兩個線程,並在每個線程加載庫來獲得兩個不同的句柄(因此有兩個加載庫的副本)。

這在Java中可能嗎? Registers Saptarshi

回答

2

任何DLL只能由進程加載一次,所以我不認爲你可以實現你想要的。你可以欺騙並將DLL重命名爲不同的名字?

你的線程在DLL中花費了那麼多時間以至於沒有其他的並行機制了?

+0

我正在加載的庫是一個名爲eval和parse的函數。我解析和評估語句(eval可能需要很長時間)。這些函數都不是線程安全的,庫的內存分配器不是線程安全的。我想要做並行評估,並且很多線程的工作是調用庫的'parse'和'eval'函數 – Sapsi 2010-01-11 15:33:55

1

這似乎不可能。 System.loadLibrary方法沒有任何參數或文檔,表明您可以以線程特定的方式加載庫或加載相同的庫兩次。

如果您有特定數量的線程,可以製作多個命名方案稍有不同的庫。否則,你應該只是實現鎖。

2

這是不可能的。這相當於使用POSIX dlopen等將C/C++庫的多個副本動態加載到C/C++程序中,這也不起作用。

您的主要選項是:

  • 修改C庫,使其線程安全

  • 重新編碼它(線程安全)的Java

  • 把它包裝成一個應用程序並作爲單獨的進程運行多個副本

  • 將其作爲服務包裝並運行多個副本,並使用它進行交談套接字或適當的更高級別的RPC機制。

相關問題