Вызов не реентерабельной собственной разделяемой библиотеки из нескольких потоков Java
У меня есть некоторый Java-код, который вызывает некоторый нативный код, изначально написанный на Фортране, с использованием JNA. (Это числовая библиотека, и многие математики пишут код на Фортране.) Она скомпилирована в.so
библиотека, см. ниже:
Я получал отличные результаты со всем, что тестировалось модулем в моем коде, но затем я попытался использовать код из нескольких потоков, и все начало работать со странными ошибками. Затем я посмотрел в некоторыематериал о реентерабельном коде Фортрана и понял, что библиотека, которую я использовал, имеет эквивалент некоторых глобальных переменных (SAVE
ключевые слова в Fortran, которые запоминают значения переменных при повторном вызове функции:Fortran SAVE заявление)
Сейчас я перевожу звонки в библиотеку вsynchronized
блоки, но это значительно снижает производительность. Мне кажется, что для реинтеграции библиотеки потребуются значительные усилия (она имеет несколько тысяч строк числового кода, и неясно, как значения переносятся при выполнении подпрограмм.) Кто-нибудь знает лучший способ обойти проблему? Мое воображение подсказывает ...
gfortran
(gcc
) компилировать код на Фортране так, чтобы он был реентерабельным?Есть ли какой-нибудь быстрый и грязный способ сделать код на Фортране реентерабельным? Я искал оRECURSIVE
ключевое слово, которое, очевидно, хранит переменные в стеке, но не совместимо с существующим кодом.Любые другие возможные решения?Я подтверждаю, что с несколькими виртуальными машинами все в порядке; это имеет смысл, поскольку они не разделяют память. Все же PITA и способ более неудобный, чем темы, хотя.