0

私は、2 つの異なるプロセスを持つプロジェクトで作業しています。

  • 最初のプロセスは、すべてのデータを共有メモリ領域に割り当てる std::map または std::set に基づくキャッシュです。
  • 2 番目のプロセスは、共有メモリにアクセスできるプロデューサ/コンシューマであるため、データが必要なときはいつでも、要求されたデータを含む共有メモリの開始アドレスを unix パイプを介してキャッシュ プロセスに問い合わせます。

これまでのところ、私は 2 つのアプローチを思い付きました。1 つ目は std::set の割り当て関数を常に共有メモリに割り当てるように変更するか、マップの値としてその共有領域へのポインターを格納するより簡単な方法です。

map<key, pointer to share region>

何か案が?:D

ありがとう!!

4

1 に答える 1

2

理論的には、カスタム アロケータを使用して、std::setまたはstd::mapこれを行うことができます。もちろん、動的に割り当てる可能性のあるコンテンツも同じカスタム アロケーターを使用するようにする必要があります。

実際の問題は、共有メモリのマップされたアドレスが同じではない可能性があることです。多くの場合、アドレスを使用および指定することでこれを回避できmmapますが、アドレス範囲は両方のプロセスで解放されている必要があります。私はSolarisでこれを行いました.Solarisは常にアドレス空間の下部に静的およびヒープを割り当て(または割り当て)、上部にスタックして、真ん中に大きな穴を残しますが、そこにさえ、そこにはないと思いますは何らかの保証であり、他のシステムには異なるポリシーがあります。それでも、プロセスがそれほど大きくない場合は、経験的に解決策を見つけることができる場合があります。(アドレスとサイズを構成パラメーターにすることをお勧めします。)

あるいは、理論的には、アロケーターは、コンテナーが使用するポインター型を定義します。共有メモリへのオフセットだけで機能するポインター型を定義できるはずです。ただし、これについては経験がありません。また、参照型は依然として真の参照 (つまり内部のポインター) であり、これを変更できないため、非常に扱いにくいのではないかと心配しています。

于 2014-02-05T09:50:03.577 に答える