Потокобезопасный сервис C# с использованием Fortran DLL
У меня есть служба aC# windows, которая запускает несколько потоков, а затем каждый поток выполняет одну и ту же функцию fortran из статической библиотеки dll, скомпилированной с Intel Fortran 9.
Когда это происходит, первая функция продолжает работать нормально, а другая вызывает исключение aC#.
Есть ли какая-либо опция компилятора, чтобы это исправить? Я много гуглил и только нахожу рекурсивный и сохраняю. Я должен проверить их в офисе завтра, но я не оптимистичен.
PS: в коде фортрана есть модули
Спасибо!
1 ответ
Ваша проблема, скорее всего, код Fortran. Для кода на Фортране нередко используются общие глобальные переменные состояния, особенно для старого кода. Это всего лишь одна из возможностей, но существует множество других причин, по которым код на Фортране может быть поточно-ориентированным для вашего использования.
Если это действительно проблема, у вас есть несколько вариантов, которые могут помочь:
- Сериализация вызовов кода Фортрана с мьютексом / блокировкой.
- Рефакторинг кода Фортрана для удаления глобального общего состояния, например, перемещение его в стек.
- Сделайте так, чтобы каждый поток использовал отдельный экземпляр DLL.
Последний вариант - довольно грубый взлом, но он может быть наиболее эффективным краткосрочным решением. Чтобы организовать отдельные экземпляры, вам просто нужно скопировать и переименовать DLL, чтобы каждый поток загружал DLL с другим именем. Даже если они идентичны, этого достаточно, чтобы убедить Windows загрузить отдельные экземпляры модуля DLL и, следовательно, отдельные экземпляры всех глобальных данных.
Одна заключительная мысль: убедитесь, что вы связываете Fortran с многопоточной версией среды выполнения Fortran.