使用 fortran dll 的线程安全 C# 服务
Posted
技术标签:
【中文标题】使用 fortran dll 的线程安全 C# 服务【英文标题】:Thread safe c# service using fortran dll 【发布时间】:2011-06-22 12:13:08 【问题描述】:我有一个 c# windows 服务,它启动几个线程,然后每个线程从使用 intel fortran 9 编译的静态 dll 库中执行相同的 fortran 函数。
当这种情况发生时,第一个函数会继续正常运行,而另一个会触发 c# 异常。
是否有任何编译器选项可以解决这个问题?我用谷歌搜索了很多,只找到递归并保存。我明天必须在办公室测试它们,但我并不乐观。
PS:fortran 代码有模块
谢谢!
【问题讨论】:
如果您显示您正在使用的代码会有所帮助。您确定问题出在 fortran 库中吗?什么是异常消息?将代码包装在关键部分以便它不会同时执行是否有意义? 【参考方案1】:您的问题很可能是 Fortran 代码。 Fortran 代码使用共享全局状态变量并不少见,尤其是对于旧代码。这只是一种可能性,但还有很多其他原因导致 Fortran 代码对于您的使用而言可能不是线程安全的。
如果这确实是问题所在,那么您有几个选项可能会有所帮助:
使用互斥锁/锁序列化对 Fortran 代码的调用。 重构 Fortran 代码以删除全局共享状态,例如将其移到堆栈上。 安排每个线程使用单独的 DLL 实例。最后一个选项是一个相当严重的黑客攻击,但它可能是最有效的短期解决方案。要安排您拥有单独的实例,您只需复制并重命名 DLL,以便每个线程加载具有不同名称的 DLL。即使它们是相同的,这也足以说服 Windows 加载 DLL 模块的单独实例,从而单独加载所有全局数据的实例。
最后一个想法:确保将 Fortran 链接到 Fortran 运行时的多线程版本。
【讨论】:
感谢大卫您的快速回复!使用互斥锁/锁序列化对 Fortran 代码的调用。我不知道该怎么做 重构 Fortran 代码以删除全局共享状态,例如将其移动到堆栈上。很长的代码!我不想那样做。如果我想重新编程整个事情,那么我会直接在 C# 中进行:D 安排每个线程使用单独的 DLL 实例。这个解决方案太棒了!真的很简单!再次感谢最后一个想法:确保将 Fortran 链接到 Fortran 运行时的多线程版本。不知道该怎么做 您在 C# 中使用带有lock
语句的锁。有一个谷歌,但它真的很简单。
是多线程运行时,它总是特定于编译器,我对编译和链接 Fortran 一无所知。事实上,如果说实话,我对 Fortran 没有什么值得谈论的,并且总是使用我最喜欢的程序来处理它:f2c。
您的回答非常有用。再次感谢!以上是关于使用 fortran dll 的线程安全 C# 服务的主要内容,如果未能解决你的问题,请参考以下文章