4

私はこれについて特に密集していますが、私がやりたいことは共通でなければならないので、重要で基本的なポイントか何かが欠けているようです:

マネージャー プロセス ( ) から固定サイズのリング バッファー オブジェクトを作成する必要がありますProcess M。このオブジェクトには、バッファから読み書きするメソッドがwrite()あります。read()読み取り/書き込みメソッドは、独立したプロセス (Process RおよびW)によって呼び出されます。

バッファを実装しました。これはSharedBuffer<T&>、boost::interprocess を使用して SHM にバッファ スロットを割り当て、単一のプロセス内で完全に動作します。SO でこの質問その質問への回答を読み、自分自身に尋ねましたが、異なるプロセスが共通のオブジェクトからメソッドにアクセスする方法についてはまだわかりません。Boost doc には、 SHM でベクトルを作成する例があり、これは私が望むものと非常に似ていますが、独自のクラスをインスタンス化したいと考えています。

私の現在のオプションは次のとおりです。

  1. newCharles B. が私の質問に提案したように、配置を使用してください。ただし、彼は、POD 以外のオブジェクトを SHM に入れるのは得策ではないと警告しています。しかし、私のクラスには読み取り/書き込みメソッドが必要です。どうすればそれらを処理できますか?
  2. クラス定義にアロケータを追加します。たとえば、ブーストで指定されたベクトルの例SharedBuffer<T&, Alloc>と同様に進めます。これは本当に複雑に聞こえます。
  3. POD クラスに変更SharedBufferします。つまり、すべてのメソッドを取り除きます。しかし、プロセス間で読み取りと書き込みを同期するにはどうすればよいでしょうか。

私は何が欠けていますか?固定長のリング バッファは非常に一般的であるため、この問題には解決策があるか、何か間違ったことをしている可能性があります。

4

1 に答える 1

1

ここでは、リング バッファは問題ではありません。共有メモリを使用することは問題です。その解決策は、オブジェクトの割り当て、または少なくともその内部バッファーの割り当てに新しい配置を使用することです。メンバー関数、コンストラクタ、およびデストラクタを使用するだけで問題が発生することはありませんが、問題が発生する可能性があるため、仮想関数を使用したり、POD 以外のオブジェクトを含めたりしないようにしてください。

于 2010-03-11T20:41:11.620 に答える