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

У меня есть некоторый Java-код, который вызывает некоторый нативный код, изначально написанный на Фортране, с использованием JNA. (Это числовая библиотека, и многие математики пишут код на Фортране.) Она скомпилирована в.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, и есть ли способ использовать его таким образом.Будет ли он все еще прикручен, даже если он был вызван с разных виртуальных машин? Как я могу проверить, чтобы убедиться?Есть ли способ получитьgfortran (gcc) компилировать код на Фортране так, чтобы он был реентерабельным?Есть ли какой-нибудь быстрый и грязный способ сделать код на Фортране реентерабельным? Я искал оRECURSIVE ключевое слово, которое, очевидно, хранит переменные в стеке, но не совместимо с существующим кодом.Любые другие возможные решения?

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

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

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