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