問題タブ [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 :: map insertは次のようになります:オーバーロードされた関数へのあいまいな呼び出し
共有メモリに保存されているboost::interprocess::mapにいくつかの値を挿入しようとしています。
問題は、コンパイルしようとすると「オーバーロードされた関数へのあいまいな呼び出し」が発生することですが、その理由はわかりません。コードスニペットは次のとおりです。
この挿入呼び出しは私にいくつかのエラーを与えます:
誰かアイデアはありますか?
c++ - 64bit と 32bit のプロセス間通信 boost::message_queue
皆さん、こんばんは。
私は現在、64 ビット プロセスと 32 ビット プロセスの間でデータを渡す方法を見つけようとしています。これはリアルタイム アプリケーションであり、両方が同じコンピューター上で実行されているため、共有メモリ (shm) を使用するのは困難です。
shm を使用した同期メカニズムを探していたときに、boost::message_queue に気付きました。しかし、それは機能していません。
私のコードは基本的に次のとおりです。
送信部
レシーバー部
このコードは、2 つのプロセスが 64 ビットまたは 32 ビットの場合に完全に機能します。ただし、2 つのプロセスが同じでない場合は機能しません。
ブースト (1.50.0) コードを詳しく見ると、message_queue_t::do_receive (boost/interprocess/ipc/message_queue.hpp) に次の行が表示されます。
scoped_lock lock(p_hdr->m_mutex);
何らかの理由で、異種プロセスで作業しているときにミューテックスがロックされているようです。私の推測では、ミューテックスがオフセットされているため、その値が破損している可能性がありますが、よくわかりません。
単にサポートされていないことを達成しようとしているのですか?
ヘルプやアドバイスをいただければ幸いです。
c++ - これらのBoost::プロセス間コンポーネントには同期が必要ですか?
Boost.Interprocessを使用して実装されたIPCを使用してマルチプロデューサー/シングルコンシューマーアプリケーションを構築しています。
managed_shared_memory::allocate
各プロデューサーは、共有メモリ( )内にブロックを割り当て、そのブロックにオブジェクトをマーシャリングすることによってメッセージを送信します。message_queue
次に、ブロックの位置(オフセット)とサイズを保持するを介して小さなオブジェクトを送信します。
コンシューマーreceives
はキューからこのインジケーターを取得し、オブジェクトをマーシャリング解除します。消費者は、メモリのブロックの割り当てを解除する責任があります。
この実装に基づいて、メモリ内に存在するオブジェクトまたはブロックは同期が必要であるとは思わない。なぜなら、コンシューマーがそれらについて知るとすぐに、プロデューサーはそれらに触れなくなるからである。したがって、同期が必要なのは内部のみであり、同期が必要であると私は信じていmessage_queue
ますmanaged_shared_memory
。
私の質問は次のとおりです。各プロセスはシングルスレッドであることに留意してください。/ allocate
、deallocate
およびsend
/receive
呼び出しには同期が必要ですか?
ドキュメントで提供されているBoostの例では、メッセージキューの同期を使用していませんが、これはサンプルソースを単純化するためだけのものだと思います。
私はこの質問を見ましたが、Boost.Interprocessのこれらの特定のコンポーネントについてではなく、スレッドセーフについて質問しています。
c++ - boost :: interprocess :: stringに文字がなく、破棄時にsegfaulting
私は現在、を使用して別のアプリケーションと通信するアプリケーションを作成していboost::interprocess
ます。しかし、私はいくつかの問題を抱えていboost::interprocess::string
ます。string
作品からの作成はconst char*
期待どおりに機能しますが、空の文字列を作成し、後で適切なコンテンツで埋めようとすると(文字列の作成時にわからないため)、最初の文字が失われます。次のサンプルコードは、この動作を示しています。
このアプリケーションの出力はSharedMem|haredMem
、であるため、期待どおりにstr
保持SharedMem
されます。ただし、文字列の最初の文字が欠落している、str2
のみが含まれています。haredMem
では、なぜstr2
1つの文字が欠落しているのでしょうか。また、この動作を回避するにはどうすればよいでしょうか。
私が抱えているもう1つの問題は、strings
使用を破棄しようとするdestroy_ptr
と、コードをコンパイルするときにセグメンテーション違反が発生することです(これは、上記のコードの最後から2行目のコメントを外したときに発生します-O3
)。その動作の理由は何ですか?また、セグメンテーション違反を回避するために別の方法で何をする必要がありますか?
私はgcc4.6.1(コンパイルフラグ-std=c++0x -O3 -g
:)を使用しており、仮想マシン(virtualBox)内のlinuxmintで1.47をブーストしています。
編集:-O2
最適化なしでコンパイルすると割り当ては正常に機能しますが、または
でコンパイルすると説明されている動作を示し-O3
ます。
さらに、割り当ては(少なくともこの考案されたサンプルコードでは)最適化でも機能します。2回実行すると、関連するコードは次のようになります。
これは今のところ問題を回避しているように見えますが、私が頼りにしたい解決策はほとんどありません。
c++ - boost::interprocess::managed_shared_memory の名前を取得する方法
managed_shared_memory
名前とサイズのオブジェクトを作成しました。その後、再度名前を取得したいと思います。どうすればいいですか?みたいな機能があると思っていたのget_name
ですが、見つけられませんでした。
c++ - 戻る必要があるにもかかわらず、タイマーブロックでプロセス間スコープロックをブーストする
を使用するアプリケーションのコードがいくつかありますboost inteprocess scoped lock with timers
。1 つのスレッドでミューテックスが取得されると、それを取得するために数ミリ秒間試行錯誤している 2 番目のスレッドは失敗し、画面に何かを記録します。
理由はわかりませんが、boost 1.50 のバージョンではこれが機能しなくなりました。以下のコードでは、スレッド #2 が「エラー」を出力せず、完全にスタックしていることがわかります。
ここで何か不足していますか?
g++ で LINUX カーネル 2.6.32 を使用しています。
UTCに対処するものでしょうか?そのようなロックで使用される時間はUTCであり、現在読んでいる日付時刻ではlocal_adjustor
、ローカルからUTCへの変換、およびその逆の変換について読んでいます。
AFG
boost - ブースト メッセージ キューを介して複雑なデータ構造を送信する
次のデータ構造があります。
ブースト メッセージ キューを使用して、このデータ構造を別のプロセスのメッセージ キュー受信者に送信しようとしました。ただし、受信後、上記の構造の「名前」変数にアクセスすると、セグメンテーション違反が発生します。
以下は私の送信者機能です:
以下は私のレシーバー関数です:
(*recvMsg).id の cout は問題ありませんが、(*recvMsg).name の cout でセグメンテーション違反が発生しました。構造のシリアル化を行う必要があることをどこかで読んでくださいが、その方法がわかりません。誰でも提案できますか?
c++ - boost::interprocessを使用した共有マップ
解決するのが難しいかもしれない単純な要件があります。このようなリードを見つけましたが、すぐに使用できないようです。前者は、私にとってビルド可能なコードにさえ変換されません。私はこれを自分で書くだけのBoostの経験はありませんが、これは一般的な要件であるように思われます。
Interprocess STL Mapにも出くわしましたが、まだ動作するコードにアセンブルできていません。
boost::interprocess
共有メモリマップを最初から作成したい場合を除いて、ここに行く方法だと思います。
移植性には関心がありません。MSコンパイラで動作するソリューション、特にVS2010に付属しているソリューションが必要です。
このポスターは、GUIDを任意の長さのバイナリバッファーにマップする必要があることを除いて、多かれ少なかれ私がやろうとしていることを望んでいるようです(ただし、intからstringへの開始点としても同様に優れています)。残念ながら、実験から始めるためにコードをきれいにコンパイルすることはできません。
また、2つの懸念があります。A)割り当てのニーズに対応するために共有メモリを自動的に(または少なくとも予測どおりに)拡大/縮小することは可能ですか?B)あるプロセスがマップを作成すると仮定すると、別のプロセスがどのようにマップに「接続」できますか?
ソリューションが割り当てのニーズを満たすために複数の共有「セグメント」を必要とするかどうかは気にしません。必ずしも単一のモノリシック共有メモリチャンクである必要はありません。
どんな助けでも大歓迎です。
c++ - Boost Interprocess Message Queue for Windowsを使用するにはどうすればよいですか?
BoostInterprocessを使用してプロセス間通信を実装しています。テストとして、ブーストのドキュメントから例を取りました。
最初のプロセス(メッセージキューを作成する)は、他のプロセス(キューからメッセージを受信する必要があります)を使用して開始します。CreateProcess(NULL, (LPSTR)commandStream.str().c_str(), NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi)
最初のプロセスは、を使用してキューを作成しますmessage_queue mq(create_only, "message_queue", 100, sizeof(int))
。
残念ながら、message_queue mq(open_only, "message_queue")
をスローしinterprocess_exception
ます。例外には、Das System kann die angegebene Dateinichtfindenという説明が含まれています。(システムは要求されたファイルを見つけることができません)。
キューの作成とオープンの両方が1つのプロセスで実行される場合、例外はスローされず、通信はドキュメントに記載されているように機能します。
誰かが例外を引き起こす可能性があるものと私がそれを解決する方法を知っていますか?
編集:私はBoost1.45を使用しています