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

时间:2011-06-22 12:13:09

标签: multithreading thread-safety fortran parallel-processing language-interoperability

我有一个c#windows服务启动几个线程,然后每个线程从使用intel fortran 9编译的静态dll库执行相同的fortran函数。

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

是否有任何编译器选项可以修复它?我google了很多,只找到递归和保存。我明天要在办公室测试一下,但我并不乐观。

PS:fortran代码有模块

谢谢!

1 个答案:

答案 0 :(得分:3)

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

如果这确实是问题,那么您可以选择一些选项:

  • 使用互斥锁/锁定来串行调用Fortran代码。
  • 重新考虑Fortran代码以删除全局共享状态,例如:将它移到堆栈上。
  • 安排每个线程使用DLL的单独实例。

最后一个选项是相当严重的黑客攻击,但它可能是最有效的短期解决方案。要安排您有单独的实例,您只需要复制并重命名DLL,以便每个线程加载具有不同名称的DLL。即使它们相同,这足以说服Windows加载DLL模块的单独实例,从而分离所有全局数据的实例。

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