Вызов не реентерабельной собственной разделяемой библиотеки из нескольких потоков Java

У меня есть некоторый Java-код, который вызывает некоторый нативный код, изначально написанный на Фортране, с использованием JNA. (Это's числовая библиотека, и многие математики пишут код на Фортране.) Она скомпилирована в.so библиотека, см. ниже:

Fortran:https://github.com/mizzao/libmao/tree/master/src/main/fortranJava-привязка:https://github.com/mizzao/libmao/blob/master/src/main/java/net/andrewmao/probability/MvnPackDirect.java

Я получал отличные результаты со всем, что тестировалось модулем в моем коде, но затем я попытался использовать код из нескольких потоков, и все начало давать сбой со странными ошибками. Затем я посмотрел в некоторыематериал о реентерабельном коде Фортрана и понял, что библиотека, которую я использовал, имеет эквивалент некоторых глобальных переменных (SAVE ключевые слова в Fortran, которые запоминают значения переменных при повторном вызове функции:Fortran SAVE заявление)

Сейчас я перевожу звонки в библиотеку вsynchronized блоки, но это значительно снижает производительность. Мне кажется, что понадобится немало усилий, чтобы перестроить библиотеку для повторного ввода (она имеет несколько тысяч строк числового кода, и это 'Не ясно, как значения переносятся во время выполнения подпрограмм.) Кто-нибудь знает лучший способ обойти проблему? Мое воображение подсказывает ...

Есть ли какой-нибудь способ заставить каждый поток Java загрузить отдельную копию разделяемой библиотеки в память, чтобы глобальные переменные были эффективно локальными для потока? Это вообще возможно? Я'Я не уверен, как JNA 's прямое или библиотечное связывание работает, и еслиспособ использовать это таким образом.Будет ли он все еще прикручен, даже если он был вызван с разных виртуальных машин? Как я могу проверить, чтобы убедиться?Есть ли способ получить (gfortrangcc) компилировать код на Фортране так, чтобы он был реентерабельным?Есть ли какой-нибудь быстрый и грязный способ сделать код на Фортране реентерабельным? Я'мы искали оRECURSIVE ключевое слово, которое, очевидно, хранит переменные в стеке, но неКажется, что он совместим с существующим кодом.Есть ли другие возможные решения?

Я подтверждаю, что с несколькими виртуальными машинами все в порядке; это имеет смысл, поскольку они неТ разделяю память. Все же PITA и способ более неудобный, чем темы, хотя.

Ответы на вопрос(2)

Ваш ответ на вопрос