すでに回答されている同様の質問があることは知っていますが、私が知りたいことを正確に示していないので、この質問をしています。これはスレッド間の同期についてです。私のプロジェクトのアイデアは、データ取得カードからデータを取得し、データ取得中にデータをプロットして分析することです。これまでのところ、あるスレッドでデータを取得するためのクラスと、別のスレッドでプロットするためのクラスしかありません。データ取得クラスはデータをグローバル循環バッファに格納し、プロットクラスはグローバルバッファからデータをコピーし、プロットのためのいくつかのプロセス(データポイントの削減など)を実行します。これは、(単一の)生産者-(単一の)消費者の問題と呼ばれるものだと思います。
それでは、データを分析する別のスレッドに別のクラスを紹介したいと思います。次に、1つのプロデューサーと2つのコンシューマーがあります。以下の条件を課したいと思います。
- 2つのリーダーは同じデータセットを共有します。つまり、作成された各アイテムは、一方だけではなく、両方のリーダーが使用する必要があります。
- バッファがいっぱいになると、データ取得クラスがグローバルバッファを上書きします。データ取得クラスによるバッファの上書きによってリーダーがデータを失った場合、これを検出し、理想的にはログに保持する必要があります(たとえば、データのどの部分がリードイヤーによって失われたか)。 )。
- 分析クラスの計算は集中的になる可能性があります。このために、分析クラスでより大きなデータバッファーが必要になる場合があります。
私が最初の部分(単一のプロデューサーと単一の消費者)を扱った方法は、2番目の部分(単一の生産者と2つの消費者)の場合に単純な方法で拡張されていないようです。どうすればいいのかしら。GUIにQtを使用しているので、スレッドにはQtを使用したC++を使用しています。ただし、解決策は必ずしもQtである必要はありません。ただし、可能であれば、サンプルコードまたは擬似コードをいただければ幸いです。私はここで私の問題に似たスレッドを見つけました)。boost::interprocessを使用することをお勧めします。ただし、これまでBoostライブラリを使用したことがなく、boost :: interprocessに関するドキュメントを読んだことがあるので、自分自身を理解するにはあまりにも複雑に見えます。
どうもありがとう!
大輔