Fortran 77 不支持递归,因此符合标准的编译器可以在程序的数据部分分配所有变量;原则上,既不需要堆栈也不需要堆[1]。
可能这就是 f2c 正在做的事情,如果是这样,可能是 f2c 步骤使程序非线程安全,而不是程序本身。当然,正如其他人所提到的,也要检查 COMMON 块。编辑: 另外,检查明确的 SAVE 指令。SAVE 的意思是在程序的后续调用之间应该保留变量的值,类似于 C 中的 static即使 Fortran 标准不保证这一点的代码。显然,这样的代码不是线程安全的。写。特别是 ARPACK,我不能保证任何事情,但 ARPACK 通常受到好评并被广泛使用,所以如果它遇到这些尘土飞扬的问题,我会感到惊讶。
大多数现代 Fortran 编译器确实使用堆栈分配。使用 gfortran 和 -frecursive 选项编译 ARPACK 可能会更好。
编辑:
[1] 不是因为它更高效,而是因为 Fortran 最初是在堆栈和堆发明之前设计的,出于某种原因,标准委员会希望保留在既不支持堆栈也不支持堆的硬件上实现 Fortran 的选项,直到Fortran 90。实际上,我猜堆栈在当今高度依赖缓存的硬件上比访问遍布数据部分的过程本地数据更有效。