私は、QuantLibのスレッドセーフプロパティ(またはそれらの不在)を明示的に記述しているドキュメントを見つけることができませんでした。 QuantLib configuration documentationにはスレッドセーフに関する多くのコンパイル時のオプションがリストされています。このオプションから、デフォルトでは、QuantLibは完全にスレッドセーフではないと推測されます。特に複数のスレッドからQuantLibを使用する正しい方法は何ですか?
、があります。
QL_ENABLE_SESSIONSは - 「定義された場合は、シングルトンが異なるセッションのための別のインスタンスを返しますあなたはライブラリと名前空間QuantLibでセッションID()関数を提供してリンクする必要があります。セッションごとに異なるセッションIDを返します。デフォルトでは未定義です。
QL_ENABLE_THREAD_SAFE_OBSERVER_PATTERN - "もし定義されていれば、オブザーバパターンのスレッドセーフですがパフォーマンスの低いバージョンが使用されます.JVMまたは.NET eco内のSWIGレイヤーを使用してQuantLibを使用する場合は、システムまたは非同期ガベージコレクタを使用する任意の環境です。デフォルトでは定義されていません。
QL_ENABLE_SINGLETON_THREAD_SAFE_INIT - "これは、スレッドセーフなシングルトン初期化を行うために定義します。デフォルトでは未定義です。複数のセッションと互換性がありません。
オプションは、私が使用してはならない、と私はQuantLib使用したい場合、私は、他にどのような措置を講じなければならない
:保持だけで同じ時間(例えばで決して複数のスレッドから
を、しかし、グローバルロック)?
同時に複数のスレッドから、それらの間にオブジェクトを共有していませんか?
同時に複数のスレッドから、それらの間でオブジェクトを共有しますか?
自分のアプリケーションのための自然な構造は、様々なオブジェクトを計算し、更新するために使用されている一方の端部に入る市場データの一定のストリームを有する有向非巡回グラフ、であり、で出る見積価格のストリームを生成します違った終わり方。いくつかの計算に時間がかかるので、複数のコアを並行して稼働させたいと思っています。
アプリケーションはほとんどがJavaで書かれており、C++の中で最小限の部分でQuantLibとのインターフェイスをとっています。 SWIGラッパーを使用する予定はありません。私はJavaのガベージコレクタの助けを借りずにQuantLibオブジェクトのメモリ管理をしています。
EDIT!これらのオプションのいずれかを設定することを決定した場合には、UNIX上で、./configureをするために、対応するフラグでそれを行う:
--enable-sessions
--enable-thread-safe-observer-pattern
--enable-thread-safe-singleton-init
「あなたが持っているオプションはどれもあなたを助けません」と言ったとき、彼らは自分が思っていることをしない、あるいはうまくいかない、あるいは何らかの理由で十分でない、または何? –
@TomAnderson彼らはあなたがしたいことをしません。 QuantLibメーリングリストを検索してください。スレッドセーフに関する記事があります。あなたがやりたいことに依存して、いくつかのコード関数はグローバル変数を使わないのでスレッドセーフです。 – SmallChess
@TomAndersonたとえば、Black Scholesを計算したいだけの場合。 BlackScholesCalculatorにはグローバル依存性がないため、確実にスレッドセーフです。 – SmallChess