C# 在C语言中,用模块变量同时调用fortran dll中的方法#

C# 在C语言中,用模块变量同时调用fortran dll中的方法#,c#,fortran,pinvoke,gfortran,C#,Fortran,Pinvoke,Gfortran,我试图在不同的线程中同时调用Fortran方法。执行完全独立于彼此和主线程。问题是,使用模块变量意味着dll将变量设置为全局变量,这意味着两个调用将使用它,从而导致程序崩溃,因此发生了这种情况。这是我的解释,基于此 C# FORTRAN !DEC$ ATTRIBUTES DLLEXPORT::ingammaextern subroutine sub(size, myarray) use module1 ! * REMOVING MODULE USAGE FIXES THE PROB

我试图在不同的线程中同时调用Fortran方法。执行完全独立于彼此和主线程。问题是,使用模块变量意味着dll将变量设置为全局变量,这意味着两个调用将使用它,从而导致程序崩溃,因此发生了这种情况。这是我的解释,基于此

C#

FORTRAN

 !DEC$ ATTRIBUTES DLLEXPORT::ingammaextern
subroutine sub(size, myarray)
    use module1   ! * REMOVING MODULE USAGE FIXES THE PROBLEM
  implicit none
INTEGER  :: size
integer :: assignme
REAL, dimension(1:size) :: myarray

assignme = size
allocate(alocarray(1:assignme))
deallocate(alocarray)
end subroutine
! ************************************begin another file***********
      MODULE module1
      IMPLICIT NONE


real, dimension(:), allocatable :: alocarray
      END MODULE module1
这个解决方案,模块的移除,是非常麻烦的,也是维护上的一大难题,因为我发布的代码问题非常大

环境:GNU Fortran编译器,windows 7 64位,Fortran代码块,VS2012,我没有更改任何编译器选项

有什么想法吗


感谢您抽出时间

我们可以做的是将模块更改为派生类型,然后在每次调用中传递派生类型

module orig
  use whatever

  interfaces

  small types

  variables

contains

  procedures

end module


每个线程都有自己的
状态
类实例,并显式地或作为传递的伪参数传递它。

从您的代码中不清楚为什么数组首先应该在模块中,也不清楚为什么要将其设为本地数组是一个维护问题。您不必删除所有模块。这是一个示例代码来说明问题。代码的原始版本有50多个模块变量,位于两个模块中。这些变量在多个文件的多个函数中使用。想象一下,在几个函数的参数列表中添加这50个参数中的一部分是多么有趣。现在想象一下,如果您需要添加或删除一个参数,这就是程序设计的艺术,共享需要共享的内容,将非共享状态保留在派生类型中,而不是无法共享的模块中。对于一个具有类型绑定过程的类,几乎每个模块都可以用一种简单的方式进行更改。
module orig
  use whatever

  interfaces

  small types

  variables

contains

  procedures

end module
module state_class

  use whatever

  interfaces

  small types

  shared variables

  type state
    non shared variables
  contains
    procedure :: the procedures
    (not obligatory)
  end type

contains

  procedures changed to accept one additional argument:
  a passed dummy argument class(state)
  or just a regular dummy argument type(state)

end module