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
のために類似した何かを行うことができますか?
これをカバーする標準はありませんが、少なくとも一部のELFシステム(特にLinux)では、GNU OpenMPランタイムと 'std :: thread'の両方がELF TLSを使用してスレッドローカル変数を格納します。したがって、OpenMPのスレッドプライベート変数もC++スレッド内のスレッドローカルです。ここでも、これは標準的でもポータブルでもありません。 –
Linuxでも、GOMPだけでなくランタイムが増えていることに注意してください。この機能では互換性がありますが、互換性はありません。しかし、C++スレッドはOpenMPスレッドと同じ低レベルのレイヤー(例えばPOSIXスレッド)の上に実装される可能性が非常に高いです。 –