問題はおそらく Fortran コードにあります。Fortran コードで共有グローバル状態変数を使用することは、特に古いコードでは珍しくありません。これは 1 つの可能性にすぎませんが、Fortran コードがスレッドセーフではない理由は他にもたくさんあります。
これが実際に問題である場合は、役立つ可能性のあるいくつかのオプションがあります。
- ミューテックス/ロックを使用して Fortran コードへの呼び出しをシリアル化します。
- Fortran コードをリファクタリングして、グローバル共有状態を削除します (スタックに移動するなど)。
- 各スレッドが DLL の個別のインスタンスを使用するように調整します。
最後のオプションは、かなり大雑把なハックですが、最も効果的な短期的な解決策になる可能性があります。個別のインスタンスを用意するには、DLL をコピーして名前を変更し、各スレッドが異なる名前の DLL をロードするようにします。それらが同一であっても、Windows が DLL モジュールの個別のインスタンスをロードし、したがってすべてのグローバル データの個別のインスタンスをロードするように説得するのに十分です。
最後に、Fortran を Fortran ランタイムのマルチスレッド バージョンにリンクしていることを確認してください。