1

いくつかのスレッドを開始し、各スレッドが intel fortran 9 でコンパイルされた静的 dll ライブラリから同じ fortran 関数を実行する ac# Windows サービスがあります。

その場合、最初の関数は正常に実行され続けますが、もう一方の関数は ac# 例外をトリガーします。

それを修正するコンパイラオプションはありますか? 私はたくさんグーグルで検索しましたが、再帰的なものだけを見つけて保存しました。明日オフィスでテストしなければなりませんが、楽観的ではありません。

PS: Fortran コードにはモジュールがあります

ありがとう!

4

1 に答える 1

3

問題はおそらく Fortran コードにあります。Fortran コードで共有グローバル状態変数を使用することは、特に古いコードでは珍しくありません。これは 1 つの可能性にすぎませんが、Fortran コードがスレッドセーフではない理由は他にもたくさんあります。

これが実際に問題である場合は、役立つ可能性のあるいくつかのオプションがあります。

  • ミューテックス/ロックを使用して Fortran コードへの呼び出しをシリアル化します。
  • Fortran コードをリファクタリングして、グローバル共有状態を削除します (スタックに移動するなど)。
  • 各スレッドが DLL の個別のインスタンスを使用するように調整します。

最後のオプションは、かなり大雑把なハックですが、最も効果的な短期的な解決策になる可能性があります。個別のインスタンスを用意するには、DLL をコピーして名前を変更し、各スレッドが異なる名前の DLL をロードするようにします。それらが同一であっても、Windows が DLL モジュールの個別のインスタンスをロードし、したがってすべてのグローバル データの個別のインスタンスをロードするように説得するのに十分です。

最後に、Fortran を Fortran ランタイムのマルチスレッド バージョンにリンクしていることを確認してください。

于 2011-06-22T12:46:54.897 に答える