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

本文关键字:fortran 调用 dll 方法 变量 模块 | 更新日期: 2023-09-27 18:04:00

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

c#

    static void Main(string[] args)
    {
        RunTwiceSync();//WORKS
        RunTwiceAsync();//INSTACRASH
    }
    private static void RunTwiceSync()
    {
        TestMyArray();
        TestMyArray();
    }
    private static void RunTwiceAsync()
    {
        ThreadStart ts = new ThreadStart(() =>
        {
            TestMyArray();
        });
        Thread t = new Thread(ts);
        t.Start();
        TestMyArray();
    }
    private static void TestMyArray()
    {
        Console.WriteLine("START");
        int size = 52;
        float[] myarray = new float[size];
        sub_(ref size, myarray);
        Console.WriteLine(myarray.Select(x => x.ToString()).Aggregate((x, y) => x + ";" + y));
        Console.ReadLine();
    }

    [DllImport("FortranArraySimpleTest.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern void sub_(ref int size, float[] myarray);

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位,CodeBlocks for Fortran, VS2012,我没有改变任何编译器选项

任何想法?

感谢您的宝贵时间

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

可以做的是为派生类型更改模块,然后在每次调用

时传递该类型。
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
每个线程都有自己的state类实例,并显式传递或作为传递的虚拟参数。