問題タブ [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++ - boost :: interprocess-共有メモリにallocate_aligned?
共有メモリのチャンク内に整列されたメモリブロックを割り当てるために使用する場合allocate_aligned
、別のプロセスで同じブロックを識別するにはどうすればよいですか?例えば
ptr
次に、別のプロセス内からどのように見つけるのですか?
整列されていない割り当ての場合、私はただ使用find_or_construct
しますが、明らかに、別のプロセスから割り当てを見つけることを可能にする割り当てに関連付けられた名前があります。ただし、調整された割り当てを行う方法はないようでfind_or_construct
あり、明らかに、匿名の割り当てを識別する方法に関するいくつかの基本的なポイントを見逃しているに違いありません。
c++ - boost::interprocess - allocate_aligned - すべてのプロセスで同じアライメントが保証されていますか?
allocate_aligned
管理された共有メモリにアラインされたメモリのチャンクを割り当てるために使用する場合、この割り当てが他のプロセスで共有されたときに同じアラインメントを持つことが保証されますか? もちろん、ドキュメントでは、ベースアドレスが異なる方法でマッピングされる可能性があることを明確にしていますが、アライメントについては何も述べていないようです。
アライメントが同じであることを示すように見える実験を実行しましたが、それは運次第かもしれないので、予想される動作についてより信頼できる確認を得たいと思います。(常識的には、同じアライメントであるべきだと言っています。そうしないとallocate_aligned
、共有メモリ内の有用性が大幅に制限されますが、常識に訴えるだけでは十分ではありません。)
c++ - プラットフォームに依存しないファイルへの非同期書き込みを実装する方法は?
リモート マシンからメッセージを受信し、そのメッセージをディスク上のファイルに書き込む必要があるプログラムを作成しています。私が見つけている困難は、このプログラムの目的がメッセージを受信するライブラリのパフォーマンスをテストすることであるため、メッセージをディスクに書き込むことがライブラリのパフォーマンスに影響を与えないことを確認する必要があるという事実にあります. ライブラリは、コールバック関数を介してメッセージをプログラムに配信します。もう 1 つの問題は、ソリューションがプラットフォームに依存しないことです。
どのようなオプションがありますか?
私は次のことを考えました:
boost:asio
ファイルへの書き込みに使用していますが、ファイルへの非同期書き込みはこのライブラリの Windows 固有の部分にあるようです (このドキュメントを参照)。したがって、これは使用できません。- を使用
boost::interprocess
してメッセージキューを作成しますが、このドキュメントは、メッセージを送信できる方法が3つあり、メッセージキューがいっぱいの場合、すべての方法でプログラムをブロックする必要があることを示しています(暗黙的または非明示的)。 - を作成し
std::deque<MESSAGES>
てコールバック関数から両端キューにプッシュし、ファイルへの書き込み中に (別のスレッドで) メッセージをポップアウトしますが、STL コンテナーはスレッドセーフであるとは限りません。両端キューへのプッシュとポップオフをロックすることはできますが、連続するメッセージ間の間隔は約 47 マイクロ秒であるため、ロックを完全に回避したいと考えています。
考えられる解決策について、これ以上のアイデアはありますか?
c++ - サポートされていないプラットフォームにブースト スレッド/プロセスを適応させる
バックグラウンド
この ドキュメントには、ライブラリを新しい (サポートされていない) オペレーティング システムに適応させることが可能であると書かれています。サポートしたい OS (リアルタイム OS) はWin32 に近いため、コードの変更はほとんどないと思います。Boost Thread と Boost Interprocess の経験はありません。
質問
- プラットフォームがサポートされていない場合、Boost の Thread と Boost の Interprocess を使用することをお勧めしますか?
- 利点と欠点は何ですか?
- どの代替案を検討しますか?
c++ - boost::interprocess_mutexとプロセスローカルboost::mutex
私はboost::interprocess_mutex
、アプリケーションが子でさえないにもかかわらず、至る所でesを使用するプロジェクトに取り組んでいますfork()
が、マルチスレッドに大きく依存しています。
interprocess_mutex
これらすべてのesを、何も壊さずにプロセスローカルミューテックスに置き換えることができると想定するのは正しいですか?
これによりパフォーマンスが向上する可能性があるという私の仮定は(最小限の要因でのみ)正しいですか?
単一の(オプションでマルチスレッドの)プロセス内でプロセス間同期を使用する理由は考えられますか?
c++ - ブースト::インタープロセスで共有メモリを正しくアンマップする方法は?
boost::interprocess::managed_shared_memory
プロセス間通信に使用しています。拡大/縮小するには、共有メモリを使用するすべてのプロセスで共有メモリのマッピングを解除する必要があります。2 つのスレッドがある場合、これはどのように行われますか?
ドキュメントを検索した限り、これboost
に対する unmap/detach 機能のようなものは存在しないので、ポインターを削除する必要があるのでしょうか? これは機能しますか: (未テスト/未コンパイル)
また、この 100% スレッド セーフを実現するには、なんらかのオブザーバー パターンを使用する必要があると考えています (ソース コードのコメントを参照してください)。
c++ - 内部のベクトルを使用して共有メモリをクリーンアップする
boost::interprocess::managed_shared_memoryを使用して、異なるプロセス間でデータを共有していますが、クリーンアップがどのように機能するのか疑問に思っていました。一般的に、私は次のような状況にならなければなりません:
boost::interprocess::shared_memory_object::remove("TEST"); を呼び出すので とにかくメモリ内のすべてが削除されるといつも思っていたので、sVecの世話をする必要はありません。しかし、Visual Leak Detector によると、この時点でいくつかのメモリ リークが発生しています。共有メモリを削除する前にベクトルをクリアすると、すべて正常に動作します。sVec はポインタを内部的に保持しているため、clear() を呼び出さなければならないのでしょうか?
c++ - ファイルに格納されたブースト multi_index_container の永続性
メモリ マップド ファイル内に割り当てられたブースト multi_index_container に頼ることはできますか? この種の「データベース」は、同じエンディアンを持つコンピューター間で移植できますか?
c++ - プロセス間ロックの持続性を高める
クラッシュする次のコードがあります。これは、この問題があるスタックへの参照を割り当てているためだと思われます。しかし、毎回ミューテックスとスコープロックをスタック割り当てするコストを回避したい
その後、関数が存在し (cache_lock はクラス フィールドです)、別のクラス メソッド内から cache_lock.lock を呼び出そうとすると、プログラムがクラッシュします (この場合、updateCache は cache_lock->lock() 部分でクラッシュします)。
2 つの質問があります。「永続的な」cache_lock を作成して、named_mutex (open_only など) を呼び出さずに再利用できるようにするにはどうすればよいですか? 毎回これを行うのは避けたい
}
次に、上記の手順を繰り返す (つまり、ミューテックスを見つけて、そこからロックを作成する) コストのかかる操作ですか?
c++ - boost::interprocess::message_queue コンストラクタの失敗
プロセスが異なるユーザーで実行されている場合、boost::interprocess::message_queue コンストラクターが失敗します。
もっと具体的に。proc1 で message_queue を作成しています。proc2 (別のユーザー) から同じ message_queue を開こうとしています。
それを機能させることは可能ですか?または、プロセスを同期する別の方法を見つける必要がありますか?
boost-1.52
OS: Windows 7 x86
コンパイラ: MSVC 2010
PSコードは簡単です。両方のプロセスが同じユーザーから開始された場合、完全に機能します。
PPS これは私が持っているメッセージ ボックスです。LastWindowError() を呼び出すことができませんでした...
私のコード(Process2の):
そう。「mq の作成」メッセージ ボックスしか表示されません。そしてその後失敗。
ブーストのアップグレードは役に立ちませんでした。