問題タブ [boost-interprocess]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - VS 2010 で boost::interprocess を使用するコードのビルドの問題
VS 2010 で、共有メモリにマップを持つ例としてオンラインでよく見られるコードを作成しようとしています。
このエラーが発生し、頭がおかしくなりました。何か案は?
c++ - Boostによるプロセス間リーダー/ライターロック
Boostを使用してリーダー/ライターロックを実装する方法を説明する場合、このスレッドはゴールドです。それは比較的単純なようで、私はそれが本当に好きですが、名前のないロックを使用しているようで、プロセス間ソリューションが必要です(ポータブルである必要はなく、Windowsのみである可能性があります)。
プロセス間通信を行う方法はありshared_mutex
ますか?あるのはわかりますが、他のロックnamed_mutex
では機能しません。shared_lock
どんなポインタでも大歓迎です。
[編集]
その間に、頭の爪にぶつかりそうなこの糸に出くわしました。私には2つの問題があります:
- 完全なコードは表示されません(使用する必要があると思います
named_upgradable_mutex
が、よくわかりません)。 - デストラクタでロック解除を行う既成のクラスを使用せず、ミューテックスで3つのraw呼び出しのシーケンスを使用する、変更された「ライター」の答えは好きではありません。
コメントや良い解決策はまだ大歓迎です。
c++ - 共有メモリ内のSTLコンテナ(Windows)
私は、いくつかのデータ構造を共有する必要がある2つのプロセスで構成されるアプリケーションに取り組んでいます。これらのクラスはさまざまなライブラリで編成されており、ライブラリはさまざまなアプリケーションで使用されます。
- 私の最初の試みはWin32で名前付き共有メモリを使用することでしたが、ここでの問題は、STLコンテナを使用できないことです。
- 解決策を探していると、 Boost Interprocessを見つけました。理解している場合は、クラス内のすべてのSTLコンテナーを「STL」BoostInterprocessコンテナーに変更する必要があります。
それで、STL(Windowsの場合)を使用してクラスまたは構造を共有する他の方法はありますか?目標は、ライブラリでBoostからの依存度が高くなりすぎないようにすることです。
ありがとう
c++ - Boost 共有メモリに関する質問
共有メモリを使用するためのシンプルだが移植可能な方法を考えています。Boost::interprocess
開始するのに適した場所のように思えましたが、いくつかの問題/懸念に遭遇しました。
- できればブースト API を使用して、何らかの方法で shm セグメントの存在を照会できますか? 私はいつでもそれを作成して
create_only
例外をキャッチしようとすることができましたが、それは悪い設計です.「良い」パスでスタックを巻き戻したくありません. - 他のプロセスがアタッチされている場合でも、セグメントを切り捨てることはできますか? (もちろん、同期を処理する場合)他のすべてのプロセスを再マップする必要があると思いますが、それらも再接続する必要がありますか?
- Boost docによると、Windowsでは、ポータブル
shared_memory_object
は実際には共有メモリ自体ではなく、メモリマップファイルです。私はそれを正しく理解しましたか?これは、回避しようとしていたウィンドウで特殊なコードを使用する必要があることを意味します。私の目的に対するBoostの適合性に疑問を抱かせます。代替手段はありますか? ブーストと戦う代わりに、プラットフォーム固有のコードを自分で作成することもできます - あなたの意見では、それは努力する価値があるでしょうか?
c++ - boost::interprocess 共有メモリ ロックを保持している場合のコア ダンプの処理
複数のマルチスレッド プロセスが、boost::interprocess (named_mutex の scoped_lock) を介して管理される共有メモリ ファイルのロックを取得しようとしているアプリケーションに取り組んでいます。
これらのプロセスの 1 つが共有メモリ ファイルのロックを保持している間にコアをダンプすると、他のすべてのプロセスはこのロックが解放されるのを待つことになるようです。
これをどのように克服できるかについてのアイデアはありますか? ロックを保持しているプロセスが終了したときに、ロックが確実に解放されるようにしたいと考えています。
問題の 1 つは、named_mutex オブジェクトのデストラクタを呼び出していないことです。これがこの問題の原因でしょうか? プロセスのコアダンプ時にデストラクタが呼び出されることが保証されていますか?
ありがとう!
c++ - boost::interprocess::managed_shared_memory::construct を使用してアプリをコンパイルしようとするとエラーが発生する
クラスconstruct<T>()
のメソッドを使用しようとすると、奇妙なコンパイル エラーが発生します。boost::interprocess::managed_shared_memory
Boost ライブラリを 1.48 バージョンで、GCC を 4.6.3 バージョンで使用しています。
問題は、managed_shared_memory object
(構造体のメンバーではない) を作成し、そのメソッドを使用してオブジェクトを構築しようとするとconstruct<T>()
、コンパイルが成功することです。
ただし、managed_shared_memory
オブジェクトが構造体内で定義されてから作成されると、メソッドの使用法のコンパイルはconstruct<T>()
失敗します:
construct
次の GCC エラーで、使用方法の行を指しています。
残念ながら、Boost と GCC の別のバージョンに対してはテストしていないので、Boost/GCC のバグなのか機能なのかはわかりません。
誰かが同様のエラーに苦労したり、何が原因であるかを知っていますか?
c++ - ポリモーフィッククラスを共有メモリに保存することは可能ですか?
私がクラスBase
とを持っているとしましょうDerived : public Base
。boost::interprocessライブラリを使用して共有メモリセグメントを構築しました。これに似たコードを持つことは可能ですか?
ここで私が見ている問題は、たとえば、Baseの派生クラスに必要なスペースが不明であるということです(つまり、どのくらいのshmemを割り当てるのですか?)
Q:アプリケーション間でポインタを介してオブジェクトを渡す方法は?
c++ - 文字列の共有メモリ ベクトルを作成する
(std) 文字列の共有メモリ ベクトルを管理するクラスを作成しようとしています。
クライアントは文字列をベクターに正常に追加し (デバッグのためにバッファーからその文字列を読み取ることにも成功します)、マネージャー (上記のコード) はシグナル (条件変数) を受信し、ベクターに文字列があることを書き込みます (27 行目)、しかしat()
、アプリケーションを介してその文字列を取得しようとするとクラッシュします。
編集:私は、の使用
std::string
が不可能であることを理解しましたstring
。この場合のためだけに、boost ipc にコンテナーがあります。これは、(boost/std) 文字列のベクトルが必要であるという事実を変更しません...
Q :共有メモリ間で文字列を渡すにはどうすればよいですか? それらをshmemのバッファ(一度に1つ以上格納できる)に格納し、2番目のプロセスでフェッチする必要があります-それが要件です。入力と出力は常にstd::string
同じですが、shmem の内部表現は異なる場合があります。
c++ - ブーストのさまざまなバージョン間での boost::interprocess::managed_shared_memory の互換性
boost::interprocess::managed_shared_memory が異なるブースト バージョン間で機能するという明示的な互換性保証はありますか? 私はそれを使用して、複数のプロセス間で整数または 10 を共有することを計画しています (これは基本的に、それらがすべて読み取り、一部が書き込むデータのリビジョン番号として機能します)。プロセスは個別にリリースされ、時々サポートが終了します。
問題は、1.51 の managed_shared_memory が 1.44 の managed_shared_memory と通信できないなどの理由で、特定のバージョンのブーストに永遠にロックダウンしているのでしょうか?
c++ - boost::interprocess::file_lock でロックされたファイルを作成する
プロセスによってboost::interprocess::file_lock
ディレクトリに書き込まれたファイルが完了するまでプロセスによって読み取られないようにするために使用したいと思います。これを行うには、書き込み中にファイルをロックし、完了したらロックを解除したいと思います。次に、ロックされているファイルをスキップする (そして戻ってくる) ことができます。x
P1
P2
P1
boost::interprocess::file_lock
P2
私が抱えている問題はboost::interprocess::file_lock
、存在するファイルのみをロックできるように見えることです。しかし、最初にファイルを作成してからロックすると、競合状態が発生します。
P1
ファイルを作成しますP2
ファイルに気づき、読み取りを開始しますP1
ファイルをロックしますP1
いくつかのデータを書き込みますP2
P1
いくつかのデータを読み取り、最後に到達し、の出力の一部のみで終了します。
だから私がやりたいのは、ファイルを作成し、作成したらすぐにロックすることです。を使用してこれを行う方法はありboost::interprocess::file_lock
ますか?