0

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 をスレッドに渡す必要がありますか? これがどのように実装されているかわかりません。私は簡単なグーグル検索を行いましたが、スレッド内で変数をロックおよびロック解除する方法について理解したものは何も見つかりませんでした。

4

1 に答える 1

1

スレッドセーフになるように特別に設計されていないオブジェクトは、そうではありません。したがって、「辞書」へのアクセスを保護するいくつかのミューテックス オブジェクトが必要になります。

// for example, HINT CCriticalSection, or CSemaphore
mutex.lock();
dictionary.add(...);
mutex.unlock();

CSemaphoreドキュメントは上記のケースを示唆していますが、 CCriticalSection(私の意見では)初心者にとっては理解しやすいです。

アプリケーションが開始するスレッドは、アプリケーションによって停止される必要があります。これを行うには、作業が完了したことをスレッドに通知します。

// for example, HINT CEvent
while(!stopped)
{
   do_work();
}

そして、アプリケーションの終了時に停止イベントを設定します。

まず、ここを読んでください。正直なところ、これらは非常に基本的な質問ですが、このことをよく学ぶために本当に時間を費やす準備をしてください. 適切なマルチスレッド コードを書くのが簡単なら、誰もがそうするでしょう。

私が言及した特定の同期クラスについては、ここに文書化されています。

于 2011-12-20T18:46:44.127 に答える