我正在使用不可重入的庫(用C語言編寫)(即庫中沒有函數是可重入的)。假設我已經通過System.load加載了庫來獲取句柄'v'。由於重入問題,我無法在兩個線程中使用v(嘗試過但無稽之談)。我可以使用鎖,但是這會破壞我可能獲得的任何並行性。Java:在兩個線程中加載相同的動態庫(兩個線程都在同一個JVM中)
我想要做的是啓動兩個線程,並在每個線程加載庫來獲得兩個不同的句柄(因此有兩個加載庫的副本)。
這在Java中可能嗎? Registers Saptarshi
我正在使用不可重入的庫(用C語言編寫)(即庫中沒有函數是可重入的)。假設我已經通過System.load加載了庫來獲取句柄'v'。由於重入問題,我無法在兩個線程中使用v(嘗試過但無稽之談)。我可以使用鎖,但是這會破壞我可能獲得的任何並行性。Java:在兩個線程中加載相同的動態庫(兩個線程都在同一個JVM中)
我想要做的是啓動兩個線程,並在每個線程加載庫來獲得兩個不同的句柄(因此有兩個加載庫的副本)。
這在Java中可能嗎? Registers Saptarshi
任何DLL只能由進程加載一次,所以我不認爲你可以實現你想要的。你可以欺騙並將DLL重命名爲不同的名字?
你的線程在DLL中花費了那麼多時間以至於沒有其他的並行機制了?
這似乎不可能。 System.loadLibrary
方法沒有任何參數或文檔,表明您可以以線程特定的方式加載庫或加載相同的庫兩次。
如果您有特定數量的線程,可以製作多個命名方案稍有不同的庫。否則,你應該只是實現鎖。
這是不可能的。這相當於使用POSIX dlopen
等將C/C++庫的多個副本動態加載到C/C++程序中,這也不起作用。
您的主要選項是:
修改C庫,使其線程安全
重新編碼它(線程安全)的Java
把它包裝成一個應用程序並作爲單獨的進程運行多個副本
將其作爲服務包裝並運行多個副本,並使用它進行交談套接字或適當的更高級別的RPC機制。
我正在加載的庫是一個名爲eval和parse的函數。我解析和評估語句(eval可能需要很長時間)。這些函數都不是線程安全的,庫的內存分配器不是線程安全的。我想要做並行評估,並且很多線程的工作是調用庫的'parse'和'eval'函數 – Sapsi 2010-01-11 15:33:55