C++ と MFC を使用して、Bloomberg からリアルタイムで情報を取得するアプリケーションを作成しています。Bloomberg API には、Bloomberg からの更新を「サブスクライブ」して PC にリアルタイムでプッシュするサブスクリプション クラスがあるため、スレッドでイベントループを実行して Bloomberg データを処理する必要があります。
帯域幅を節約するために、ディクショナリを使用してブルームバーグ ティッカーを最後の価格にマップしたいので、同じティッカーに対して複数の結果を取得する (つまり、同じティッカーが複数回ある) 代わりに、プログラムは次のことを行います。辞書で調べます。そうすれば、個別のティッカーをサブスクライブするだけで済みます。
以前にマルチスレッドを使用したことがなく、MSDN のドキュメントを読んでいましたが、何をする必要があるかを理解するのに苦労しています。
私の理解では、AfxBeginThread() を使用してワーカー スレッドを作成し、辞書のインスタンスへのポインターを渡す必要があります。ワーカー スレッドは、残りのプログラムの実行中に辞書を更新します。
この辞書はスレッドによってロックされていますか? 更新中に安全にアクセスできますか?
プログラムが終了するまでスレッドをバックグラウンドで実行したままにしておくことはできますか? プログラムを終了するときにスレッドを明示的に強制終了する必要がありますか? それとも自動的に終了しますか?
これは正しいと思いますか、それとも基本的な何かが欠けていますか?
そこで、ティッカーと価格を格納する CMap(CString,LPCSTR,double, double) を作成しました。LPVOID を介して CMap へのポインターを渡すと、CMap がリアルタイムで更新されます。これはすべて機能しています。CMap 内の変数を検索して、リアルタイムの価格を取得できます。
ただし、現時点では「スレッドセーフ」ではありません。CMap に書き込むスレッドは 1 つだけで、それ以外はすべて CMap のデータを読み取るだけなので、今のところ大したことではありません。
ただし、優れたプログラミング プラクティスを学習するには、CMap に書き込むときに CEvent を使用する必要がありますか? CEvent をスレッドに渡す必要がありますか? これがどのように実装されているかわかりません。私は簡単なグーグル検索を行いましたが、スレッド内で変数をロックおよびロック解除する方法について理解したものは何も見つかりませんでした。