2017-07-19 6 views
1

std::threadsの異なる設定のFortran90関数を実行したいと考えています。多くのモジュールを使用して設定や一般データを保存しています。私が見ている問題は、Fortranモジュールはシングルトンオブジェクトに似ていることです。 2つのスレッドで関数を呼び出すと、同じモジュールで動作します。 openmpのようにモジュールをthreadprivateにする方法はありますか?例えばC++でFortranモジュールをstd :: threadで使用する

は、OpenMPでスレッドプライベートデータを持つモジュールは、次のようになります。

MODULE EXAMPLE 
    USE OMP_LIB 
    ! some threadprivate data: 
    INTEGER           :: VALUE = 0 
    ! make value threadprivate. 
    !$OMP THREADPRIVATE(VALUE) 
    CONTAINS 
END MODULE EXAMPLE 

私はstd::threadのために類似した何かを行うことができますか?

+1

これをカバーする標準はありませんが、少なくとも一部のELFシステム(特にLinux)では、GNU OpenMPランタイムと 'std :: thread'の両方がELF TLSを使用してスレッドローカル変数を格納します。したがって、OpenMPのスレッドプライベート変数もC++スレッド内のスレッドローカルです。ここでも、これは標準的でもポータブルでもありません。 –

+1

Linuxでも、GOMPだけでなくランタイムが増えていることに注意してください。この機能では互換性がありますが、互換性はありません。しかし、C++スレッドはOpenMPスレッドと同じ低レベルのレイヤー(例えばPOSIXスレッド)の上に実装される可能性が非常に高いです。 –

答えて

1

C++標準スレッドは、Fortranとはまったく異質です。 Fortranでは何もできません。

グローバル変数(モジュール)ではなく、他の方法でデータを格納する方法ですべてを実装する必要があります。

+0

ありがとうございます。実際に私はライブラリの再実装を避けることを望んでいました。私は他の方法がないかもしれないと思う。 – andrew28349

関連する問題