Multithreading 使用fortran dll的线程安全c#服务

Multithreading 使用fortran dll的线程安全c#服务,multithreading,thread-safety,fortran,parallel-processing,language-interoperability,Multithreading,Thread Safety,Fortran,Parallel Processing,Language Interoperability,我有一个c#windows服务,它启动两个线程,然后每个线程从使用英特尔fortran 9编译的静态dll库中执行相同的fortran函数 当这种情况发生时,第一个函数保持正常运行,而另一个函数触发c#异常 有没有编译器选项来修复这个问题?我在谷歌上搜索了很多,只找到了递归和保存。明天我必须在办公室测试它们,但我并不乐观 PS:fortran代码有模块 谢谢 您的问题很可能是Fortran代码。Fortran代码使用共享全局状态变量并不少见,尤其是对于较旧的代码。这只是一种可能性,但Fortra

我有一个c#windows服务,它启动两个线程,然后每个线程从使用英特尔fortran 9编译的静态dll库中执行相同的fortran函数

当这种情况发生时,第一个函数保持正常运行,而另一个函数触发c#异常

有没有编译器选项来修复这个问题?我在谷歌上搜索了很多,只找到了递归和保存。明天我必须在办公室测试它们,但我并不乐观

PS:fortran代码有模块


谢谢

您的问题很可能是Fortran代码。Fortran代码使用共享全局状态变量并不少见,尤其是对于较旧的代码。这只是一种可能性,但Fortran代码对于您的使用可能不是线程安全的,还有很多其他原因

如果这确实是一个问题,那么您有几个选项可能会有所帮助:

  • 使用互斥锁/锁序列化对Fortran代码的调用
  • 重新分解Fortran代码以删除全局共享状态,例如将其移动到堆栈上
  • 安排每个线程使用单独的DLL实例
最后一个选择是一个相当严重的攻击,但它可能是最有效的短期解决方案。要安排有单独的实例,只需复制并重命名DLL,以便每个线程加载具有不同名称的DLL。即使它们相同,这也足以说服Windows加载DLL模块的单独实例,从而加载所有全局数据的单独实例


最后一个想法是:确保将Fortran链接到Fortran运行时的多线程版本。

如果您展示了正在使用的代码,这会有所帮助。您确定问题出在fortran库中吗?异常消息是什么?将代码包装在关键部分以便不同时执行是否有意义?感谢david的快速响应!!使用互斥锁/锁序列化对Fortran代码的调用。我不知道如何重新考虑Fortran代码以删除全局共享状态,例如将其移动到堆栈上。很长的代码!我不想那样做。如果我想重新编写整个程序,那么我会直接在C#中执行:D安排每个线程使用单独的DLL实例。这个解决方案很好!!!真的很简单!再次感谢最后一个想法:确保您将Fortran链接到Fortran运行时的多线程版本。不知道如何做您在C#中使用带有
lock
语句的锁。有一个谷歌,但它真的很简单。如果是多线程运行时,它总是特定于编译器,我对编译和链接Fortran一无所知。事实上,如果说实话,我对Fortran一无所知,并且总是用我最喜欢的程序来处理它:。你的答案非常有用。再次感谢!