以线程安全的方式从C库提供外部例程

以线程安全的方式从C库提供外部例程,c,linker,fortran,global,ffi,C,Linker,Fortran,Global,Ffi,我有一个c库,它围绕着我想在OCaml中使用的fortran库。显而易见的解决方案是使用一些手写代码将c接口映射到ocaml例程来处理GC 然而,事实证明,fortran库实现的算法将其输入作为外部例程,即: EXTERNAL RHS 这意味着输入基本上是由链接器传递的。C-wrapper有一个很好的接口,收集结构中所有必需的输入,但本质上提供该结构的一个全局实例,然后根据该全局实例定义所有缺少的外部例程 作为一个函数式程序员,这闻起来像是一种反模式。由于我不想重写fortra

我有一个c库,它围绕着我想在OCaml中使用的fortran库。显而易见的解决方案是使用一些手写代码将c接口映射到ocaml例程来处理GC

然而,事实证明,fortran库实现的算法将其输入作为外部例程,即:

EXTERNAL         RHS
这意味着输入基本上是由链接器传递的。C-wrapper有一个很好的接口,收集结构中所有必需的输入,但本质上提供该结构的一个全局实例,然后根据该全局实例定义所有缺少的外部例程

作为一个函数式程序员,这闻起来像是一种反模式。由于我不想重写fortran代码,我的问题是:

  • 是否有一种安全、惯用的方法来链接fortran库并避免全局状态分支?C库能否提供fortran库的全局状态而不重写fortran代码

  • 如果不存在这样的方式,那么保护全局状态的好的C11(即操作系统独立)习惯用法是什么?我需要一种全局锁,它只允许通过只发出一次的密钥进行访问

  • 我刚刚读到C11中的线程本地声明,这是一个选项吗


最后一个要点只是一个互斥锁。每个多任务操作系统都有它们。如果您的操作系统符合POSIX,请查找
pthread\u mutex\u lock
和朋友。当然,我宁愿避免操作系统依赖于该级别。该库也可能在windows下使用。因此,我想我需要某种类型的#ifdef代码段来正确地实现这一点。很可能,重写Fortran例程以接受函数指针会短得多,然后在它周围编造一个乱码。
EXTERNAL
本身并不一定等同于全局状态/“链接器提供的输入”。如果外部语句中的名称也是一个伪参数,那么它将被传入,就像任何其他过程参数一样。(如果这还不是一个伪论点,那么按照弗拉基米尔的建议把它变成一个伪论点可能相对简单。)
COMMON
另一方面,是一个不同的问题,也是全球状态更常见的原因。最后一个要点只是一个互斥。每个多任务操作系统都有它们。如果您的操作系统符合POSIX,请查找
pthread\u mutex\u lock
和朋友。当然,我宁愿避免操作系统依赖于该级别。该库也可能在windows下使用。因此,我想我需要某种类型的#ifdef代码段来正确地实现这一点。很可能,重写Fortran例程以接受函数指针会短得多,然后在它周围编造一个乱码。
EXTERNAL
本身并不一定等同于全局状态/“链接器提供的输入”。如果外部语句中的名称也是一个伪参数,那么它将被传入,就像任何其他过程参数一样。(如果这还不是一个虚假的论点,那么按照弗拉基米尔的建议将其变成一个可能相对简单的论点。)
公共
另一方面,是一个不同的问题,也是全球国家更常见的原因。