Потоково-безопасный сервис C # с использованием Fortran DLL - PullRequest
1 голос
/ 22 июня 2011

У меня есть служба ac # windows, которая запускает несколько потоков, а затем каждый поток выполняет одну и ту же функцию fortran из статической библиотеки dll, скомпилированной с Intel Fortran 9.

Когда это происходит, первая функция продолжает работатьпросто отлично, в то время как другой вызывает исключение ac #.

Есть ли какая-нибудь опция компилятора, чтобы это исправить?Я много гуглил и только нахожу рекурсивный и сохраняю.Завтра я должен проверить их в офисе, но я не настроен оптимистично.

PS: в коде Фортрана есть модули

Спасибо!

1 Ответ

3 голосов
/ 22 июня 2011

Ваша проблема, скорее всего, код Fortran.Для кода на Фортране нередко используются общие глобальные переменные состояния, особенно для старого кода.Это всего лишь одна из возможностей, но существует множество других причин, по которым код на Фортране может быть поточно-ориентированным для вашего использования.

Если это действительно проблема, у вас есть несколько вариантов, которые могут помочь:

  • Сериализация вызовов кода Фортрана с мьютексом / блокировкой.
  • Рефакторинг кода Фортрана для удаления глобального общего состояния, например, перемещения его в стек.
  • Сделайте так, чтобы каждый поток использовал отдельный экземпляр библиотеки DLL.

Последний вариант - довольно грубый взлом, но он может быть наиболее эффективным краткосрочным решением.Чтобы организовать отдельные экземпляры, вам просто нужно скопировать и переименовать DLL, чтобы каждый поток загружал DLL с другим именем.Даже если они идентичны, этого достаточно, чтобы убедить Windows загрузить отдельные экземпляры модуля DLL и, следовательно, отдельные экземпляры всех глобальных данных.

Одна заключительная мысль: убедитесь, что вы связываете Фортран с несколькимимногопоточная версия среды исполнения Fortran.

...