問題タブ [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::scoped_lock を保持している間にスリープすると、決して解放されません
参照に従ってLinuxでIPCを実行しています(匿名ミューテックスの例)。boost::interprocess::shared_memory_object
でラップされた;shared_memory_object
を保持しながら、 を作成して書き込むサーバープロセスがあります。そして、他の人が書いたものは何でも印刷するクライアントプロセス - この場合、それは.interprocess_mutex
scoped_lock
int
問題が発生しました。サーバーがミューテックスを保持している間にスリープ状態になると、クライアント プロセスはミューテックスを取得できず、永遠に待機します。
バグのあるサーバーループ:
サーバー出力:
クライアントループ:
クライアント出力 (永久に待機):
問題は、ブラケットをsleep
呼び出しの前の行に移動すると、すべてが機能することです。なんで?ロックされたミューテックスでスリープすると、ミューテックスが永久にロックされるとは思いませんでした。
私が持っている唯一の理論は、カーネルがサーバー プロセスを起動すると、スコープが終了し、ミューテックスが解放されるが、待機中のプロセスには実行の機会が与えられないというものです。その後、サーバーはロックを再取得します...しかし、それはあまり意味がないようです。
ありがとう!
c++ - プロセス間ブースト:共有メモリとstlタイプ
私は単純な構造体を持っています:
そして私はそれを共有メモリに入れています:
共有メモリと通信する2つのアプリケーションが異なるバージョンのVisualStudio(異なるバージョンのstl実装)を使用して構築されている場合、stlタイプの代わりにネイティブタイプ(char *など)を共有メモリに配置する必要がありますか?
編集:
で試してみました
そしてそれは動作します!
c++ - 共有メモリ、MPI、およびキューイングシステム
私のunix/windows C ++アプリは、MPIを使用してすでに並列化されています。ジョブはN cpusに分割され、各チャンクは並列で実行され、非常に効率的で、非常に高速なスケーリングで、ジョブは正しく実行されます。
ただし、一部のデータは各プロセスで繰り返され、技術的な理由から、このデータをMPIで簡単に分割することはできません(...)。例えば:
- 5 Gbの静的データ、各プロセスにまったく同じものがロードされます
- MPIで分散できる4Gbのデータは、使用されるCPUが多いほど、このCPUあたりのRAMは小さくなります。
4 CPUジョブでは、これは少なくとも20GbのRAM負荷を意味し、メモリの大部分は「無駄」になります。これはひどいことです。
全体的な負荷を減らすために共有メモリを使用することを考えています。「静的」チャンクは、コンピューターごとに1回だけロードされます。
したがって、主な質問は次のとおりです。
ノード上でメモリを共有するための標準的なMPIの方法はありますか? ある種のすぐに利用できる+無料のライブラリ?
- そうでない場合は、
boost.interprocess
MPI呼び出しを使用して、ローカル共有メモリ識別子を配布します。 - 共有メモリは、各ノードの「ローカルマスター」によって読み取られ、共有読み取り専用になります。変更されないため、セマフォ/同期の種類は必要ありません。
- そうでない場合は、
パフォーマンスの低下や注意すべき特定の問題はありますか?
- (「文字列」や過度に奇妙なデータ構造はありません。すべてを配列と構造ポインターにまとめることができます)
ジョブはPBS(またはSGE)キューイングシステムで実行されます。プロセスがクリーンでない出口の場合、それらがノード固有の共有メモリをクリーンアップするかどうか疑問に思います。
string - 共有メモリと文字列: 管理されていますか?
boost::interprocess::string
共有メモリに 問題があります。
を使用するshared_memory_object
と、さまざまなフィールドを持つ構造体を操作できますが、文字列 (セグメンテーション エラーが発生します)。
反対に、私が使用するときは、managed_shared_memory
すべて問題ありません。
私は何か間違ったことをしていますか?を使用するとパフォーマンスが低下するかどうか知っていますmanaged_shared_memory
か?
ありがとうございました!
timeout - プロセス間の匿名条件 timed_wait をコンパイルできない
私は何が間違っているのか疑問に思っています...ソールwait
ではコンパイルして実行しますが、timed_wait
:では実行しません。
[...]
どこobj->mutex
でboost::interprocess::interprocess_mutex
とobj->condition
ですboost::interprocess::interprocess_condition
。g++ エラー ログは次のとおりです。
これは条件クラスのメンバー関数 (boost/interprocess/sync/interprocess_condition.hpp) のプロトタイプです。
(ブースト 1.40)
c++ - Boost を使用して共有メモリに循環バッファを作成する際の問題
circular_buffer
Boostライブラリと Interprocess ライブラリを使用して、共有メモリに循環バッファを作成しようとしています。問題なく共有メモリにベクトルを作成するために、インタープロセスのドキュメントに記載されている例をコンパイルして実行しました。ただし、Boost circle_buffer を次のように使用するように変更すると、次のようになります。
コンパイル エラーが発生します (原因:) segment.construct()
。私が間違っていることは何ですか?circular_buffer
にリストされているコンテナの 1 つでないため/boost/interprocess/containers
、つまり、Interprocess と互換性がないためですか?
ありがとう、
ハ
c++ - boost.interprocess の共有メモリからの memcpy の問題
これは私を欲求不満に駆り立てています。データの読み取り/保存ができる Boost.Interprocess を通じて作成された共有メモリで使用する共有メモリ バッファ クラスを作成しようとしています。機能をテストするために次のように書きました
これを実行すると、データは正常に書き込まれmemcpy
ますが、読み取りループの最初でセグメンテーション違反が発生します。gdb は次のように述べています。
プログラムは信号 EXC_BAD_ACCESS を受信しました。メモリにアクセスできませんでした。理由: __memcpy () のアドレス: 0x0000000000000000 0x00007fffffe007c5 の KERN_INVALID_ADDRESS
(gdb) ここで
#0 0x00007fffffe007c5 in __memcpy () #1 0x0000000100000e45 in main (argc=1, argv=0x7fff5fbff9d0) at try.cpp:36
機能はとてもシンプルで、何が欠けているのかわかりません。どんな助けでも大歓迎です。
c++ - 異なるプロセスで共有されるリング バッファを作成するのが (C++ で) 難しいのはなぜですか?
私はこれについて特に密集していますが、私がやりたいことは共通でなければならないので、重要で基本的なポイントか何かが欠けているようです:
マネージャー プロセス ( ) から固定サイズのリング バッファー オブジェクトを作成する必要がありますProcess M
。このオブジェクトには、バッファから読み書きするメソッドがwrite()
あります。read()
読み取り/書き込みメソッドは、独立したプロセス (Process R
およびW
)によって呼び出されます。
バッファを実装しました。これはSharedBuffer<T&>
、boost::interprocess を使用して SHM にバッファ スロットを割り当て、単一のプロセス内で完全に動作します。SO でこの質問とその質問への回答を読み、自分自身に尋ねましたが、異なるプロセスが共通のオブジェクトからメソッドにアクセスする方法についてはまだわかりません。Boost doc には、 SHM でベクトルを作成する例があり、これは私が望むものと非常に似ていますが、独自のクラスをインスタンス化したいと考えています。
私の現在のオプションは次のとおりです。
new
Charles B. が私の質問に提案したように、配置を使用してください。ただし、彼は、POD 以外のオブジェクトを SHM に入れるのは得策ではないと警告しています。しかし、私のクラスには読み取り/書き込みメソッドが必要です。どうすればそれらを処理できますか?- クラス定義にアロケータを追加します。たとえば、ブーストで指定されたベクトルの例
SharedBuffer<T&, Alloc>
と同様に進めます。これは本当に複雑に聞こえます。 - POD クラスに変更
SharedBuffer
します。つまり、すべてのメソッドを取り除きます。しかし、プロセス間で読み取りと書き込みを同期するにはどうすればよいでしょうか。
私は何が欠けていますか?固定長のリング バッファは非常に一般的であるため、この問題には解決策があるか、何か間違ったことをしている可能性があります。
c++ - 共有メモリ内のカスタム アロケータを使用してクラスをインスタンス化する
次の問題が原因で髪を引っ張っています。boost.interprocess ドキュメントに記載されている例に従って、共有メモリに記述した固定サイズのリング バッファー バッファー クラスをインスタンス化しています。私のクラスのスケルトン コンストラクターは次のとおりです。
私の最初の質問: この種の割り当ては、バッファ ノードが連続したメモリ ロケーションに割り当てられることを保証しますか?つまりm_start_ptr + n*sizeof(BufferNode)
、Read()
メソッドでアドレスから n 番目のノードにアクセスしようとすると、機能しますか? そうでない場合、リンクされたリストを作成して、ノードを保持するためのより良い方法は何ですか?
私のテストハーネスは次のとおりです。
これにより、最後のステートメントのテンプレートに関連するあらゆる種類のコンパイル エラーが発生します。私は何を間違っていますか?segment.construct<MyBuf>("MyBuffer")(100, alloc_inst)
2 つのテンプレート パラメータを提供する正しい方法はありますか?