Fortran 77 は再帰をサポートしていないため、標準準拠のコンパイラはすべての変数をプログラムのデータ セクションに割り当てることができます。原則として、スタックもヒープも必要ありません [1]。
これが f2c が行っていることである可能性があります。そうである場合、プログラム自体ではなく、プログラムを非スレッドセーフにする f2c ステップである可能性があります。もちろん、他の人が言及したように、COMMON ブロックもチェックしてください。編集処置: また、明示的なSAVEディレクティブを確認してください。SAVE は、C の static と同様に、後続のプロシージャの呼び出し間で変数の値を保持する必要があることを意味します。データ セクションにすべてのプロシージャ ローカル データを割り当てると、すべての変数が暗黙的に SAVE になります。 Fortran 標準では保証されていませんが、これを想定しているコードです。そのようなコードは、明らかにスレッドセーフではありません。に関して。特に ARPACK については、何も約束できませんが、一般的に ARPACK は高く評価されており、広く使用されているため、この種のダスティ デッキの問題が発生した場合は驚くでしょう。
最新の Fortran コンパイラのほとんどは、スタック割り当てを使用しています。たとえば、gfortran と -frecursive オプションを使用して ARPACK をコンパイルすると、うまくいくかもしれません。
編集:
[1] より効率的だからではなく、Fortran はもともとスタックとヒープが発明される前に設計されたものであり、何らかの理由で、標準化委員会がスタックもヒープもサポートしないハードウェアに Fortran を実装するオプションを保持したかったためです。 Fortran 90. 実際、今日のキャッシュに大きく依存するハードウェアでは、データ セクション全体に分散しているプロシージャ ローカル データにアクセスするよりも、スタックの方が効率的であると思います。