3

すでに回答されている同様の質問があることは知っていますが、私が知りたいことを正確に示していないので、この質問をしています。これはスレッド間の同期についてです。私のプロジェクトのアイデアは、データ取得カードからデータを取得し、データ取得中にデータをプロットして分析することです。これまでのところ、あるスレッドでデータを取得するためのクラスと、別のスレッドでプロットするためのクラスしかありません。データ取得クラスはデータをグローバル循環バッファに格納し、プロットクラスはグローバルバッファからデータをコピーし、プロットのためのいくつかのプロセス(データポイントの削減など)を実行します。これは、(単一の)生産者-(単一の)消費者の問題と呼ばれるものだと思います。

それでは、データを分析する別のスレッドに別のクラスを紹介したいと思います。次に、1つのプロデューサーと2つのコンシューマーがあります。以下の条件を課したいと思います。

  1. 2つのリーダーは同じデータセットを共有します。つまり、作成された各アイテムは、一方だけではなく、両方のリーダーが使用する必要があります。
  2. バッファがいっぱいになると、データ取得クラスがグローバルバッファを上書きします。データ取得クラスによるバッファの上書きによってリーダーがデータを失った場合、これを検出し、理想的にはログに保持する必要があります(たとえば、データのどの部分がリードイヤーによって失われたか)。 )。
  3. 分析クラスの計算は集中的になる可能性があります。このために、分析クラスでより大きなデータバッファーが必要になる場合があります。

私が最初の部分(単一のプロデューサーと単一の消費者)を扱った方法は、2番目の部分(単一の生産者と2つの消費者)の場合に単純な方法で拡張されていないようです。どうすればいいのかしら。GUIにQtを使用しているので、スレッドにはQtを使用したC++を使用しています。ただし、解決策は必ずしもQtである必要はありません。ただし、可能であれば、サンプルコードまたは擬似コードをいただければ幸いです。私はここで私の問題に似たスレッドを見つけました)。boost::interprocessを使用することをお勧めします。ただし、これまでBoostライブラリを使用したことがなく、boost :: interprocessに関するドキュメントを読んだことがあるので、自分自身を理解するにはあまりにも複雑に見えます。

どうもありがとう!

大輔

4

2 に答える 2

2

両方のコンシューマーがすべてのデータ項目を表示する必要がある場合は、コンシューマーごとにバッファーを使用する方がよいでしょう。その後、プロデューサーは同じデータを各バッファーに投稿できます。この方法でデータを2倍にするメモリ要件が心配で、データがコンシューマーによって変更されない場合は、などの参照カウントポインターを使用boost::shared_ptrして、データへのポインターを各バッファーにポストできます。このようにしてデータ項目は共有されますが、リーダーはデータを独立して処理できます。

一部のデータを上書きしたことをプロデューサーログに記録するのは非常に簡単なはずです。

于 2010-10-01T14:29:37.567 に答える
0

ハーブサッターによる以下の並行性の記事を読んで、物事をどのように構造化するか、そしてどのようにスケーラブルにするか(それが目標である場合)を理解する必要があると思います。以下のリンクは最新の記事ですが、以前の記事の完全なリストも含まれています。

http://herbsutter.com/2010/09/24/effective-concurrency-know-when-to-use-an-active-object-instead-of-a-mutex/

一言で言えば、可能であれば、すべてをミューテックスでラップするのではなく、実際のリソースでの競合を減らすために、各スレッドのデータのコピーを作成する必要があります。このアークティクルはこれについてです。

http://herbsutter.com/2008/05/23/effective-concurrency-maximize-locality-minimize-contention/

于 2010-10-01T13:30:33.900 に答える