問題タブ [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.

0 投票する
4 に答える
3449 参照

synchronization - クラッシュ後もミューテックスという名前のプロセス間ブーストが取得されたままになる

私はaと aboost::interpocess::scoped_lockを使用しています。Linux OSで実行しています。named_mutextimeout

テストの 1 つ中にクラッシュが発生しました。それ以来、アプリケーションを再度実行しようとすると、ロックを作成した時点でスタックしてしまいます。ミューテックスが何らかの方法で取得されたままになっているようです (それを使用するプロセスは実行されていません)。

それに加えて、以下のコードを見ると、150 マイクロ秒後に timedscoped_lockが返されてエラーが返されることが予想されます..しかし、そうではありません..ただそこでハングします。

私の質問は次のとおりです。

  1. boost::interprocess名前付きミューテックスが確実に破棄されるようにするには? (プロセス全体で共有ミューテックスを確認する方法とそれらを破棄する方法)
  2. ミューテックスの取得が 150 マイクロ秒後に返されないのはなぜですか? 以下のコードに何か問題がありますか?

どうもありがとう

AFG

0 投票する
0 に答える
243 参照

boost - アウトプロセス *.exe COM サーバーの一部の間で通信する方法は?

アウトプロセス COM サーバーでもある *.exe アプリケーションがあります。

メイン スレッドは何らかのネットワーク ルーチンを実行しています。つまり、データ パケットを受信して​​キューに入れます。

COMクライアント、たとえばVBAはCOMサーバーを使用し、キューも使用したいと考えています。それらが同じアドレス空間にあるという事実にもかかわらず、問題は次のとおりです。

COM クライアントが exe プロセスと同時にキューを使用できるようにするにはどうすればよいでしょうか。

共有メモリを使用するアイデアがありましたが、成功しませんでした

更新:

boost::interprocess を使用しようとしました。同じアドレス空間のため、オブジェクト ポインターを共有したかっただけです。

exe部分:

COM 部分:

COMクライアント(VBA)が教えてくれる

オブジェクト「IMyCOMServer」のメソッド「ADD」に失敗しました

UPD2:

Com 部分を try{}catch{} で囲んだところ、「ファイルが見つかりません」というメッセージの例外が発生したことがわかりました。

0 投票する
2 に答える
997 参照

c++ - OSXで共有メモリをx86から​​x64に、またはその逆に読み取る

64ビットアプリケーションからSMを作成し、32ビットアプリケーションで開くと失敗します。

64ビットアプリケーションによって作成されたファイルは、次のパスにあります。

ここで、32ビットアプリケーションによって検索されたファイルはパスにあります

したがって、32ビットアプリケーションはファイルを読み取ることができません。

Mac OSXでboost1.47.0を使用しています。バグですか?それを修正するために、いくつかの設定でいくつかのマクロを使用する必要がありますか?誰かが以前にこの問題に遭遇したことがありますか?

0 投票する
1 に答える
820 参照

c++ - ブーストscoped_lockによるCPU消費量が多すぎる

共有メモリでの書き込み操作を待機するコードがあります。誰も書いていなければ、それは待ち続けます。

サンプリングを行ったところ、CPUの約90%を消費していることがわかりました。

誰かがこのパフォーマンスの問題を解決するのを手伝ってもらえますか?添付画像をご覧ください。

スクリーンショット

0 投票する
0 に答える
844 参照

c++ - boost::shared_memory_object を安全に削除する方法

IPC に boost::shared_memory_object を使用しています。クライアントとサーバーがあります。2 つのメッセージ キューを使用します。1 つはサーバーに要求を送信するためのもので、もう 1 つはサーバーからの応答を受信するためのものです。これは非同期プロトコルです。私の問題は、失敗した場合に shared_memory_objects を安全に削除する方法がわからないことです。次のシナリオを検討してください。

  1. サーバーの起動
  2. クライアントが起動してサーバーに接続します。メッセージ キューは共有メモリに作成されます。
  3. クライアントは定期的にハートビートをサーバーに送信します。全て大丈夫。
  4. 処理が多すぎるため、クライアントが処理を停止します。いくつかの心拍を逃します
  5. サーバーはクライアントが死んでいると判断し、キューをクリーンアップします (shared_memory_object::remove は、その共有メモリ セグメントへのハンドルが開いている実行中のプロセスがある場合でも、キューを削除します)
  6. クライアントは処理を終了します。削除されたメッセージキューへの書き込みを試みます:

ここですべての地獄が解き放たれます。書き込みが成功することもあれば、クラッシュすることもあります。メッセージキューが削除された後、他のプロセスが同じメモリアドレスに新しい共有メモリオブジェクトを作成したかどうかは誰にもわかりません...

明らかに、クライアントがサーバーがダウンしていると判断してキューを削除すると、キューに対して読み取り/書き込みを試行するサーバー スレッドがクラッシュする (またはメモリが破損する) 可能性があります。

0 投票する
1 に答える
259 参照

c++ - Boost.MPI/Boost.Interprocess - プロセスが同じマシンで実行されているかどうかを検出する方法は?

したがって、boost.mpi を使用して、クラスター内の 2 台のマシンでアプリを実行します。それぞれに 8 つのコアがあり、16 のプロセスが開始されます。私のプロセスは、どのクラスターで実行されているかをどのように確認できるのでしょうか? どうやってマシンに名前を付けて保存するのですか?

0 投票する
2 に答える
2844 参照

c++ - intとstringでプロセス間マップをブースト

Boostインタープロセスを使用してマップを共有メモリに保存する次のコードがあります

このコードはコンパイルされません..次のエラーがスローされます

違いは

だから私は推測しています

正しい方法ではありません。エラーがある場合は、マップにどのように挿入する必要がありますか。それ以外の場合、エラーは何ですか。

0 投票する
1 に答える
1411 参照

c++ - 共有メモリ内のブースト マップ内にブースト ベクターを挿入する

これは私がこれまでに持っているものです。しかし、これはコンパイルさえしません。それを機能させるにはどうすればよいですか?

このベクトルをマップに挿入するにはどうすればよいですか? これは私が試したことの1つです

しかし、うまくいかないようです。共有メモリ内のベクトルへのポインターを作成することは正しい方法ではないことを知っています。マップに挿入する場合は、そのオブジェクトを作成する必要があります。しかし、それを行う方法、または少なくともこれらのものを共有メモリに組み込む方法は?

g++ によってスローされるエラーは次のとおりです。

54行目はメインの最後の行です(リターン)

46 行目は mymap-> insert 行です。

0 投票する
2 に答える
478 参照

c++ - プロセス間ベクトルをブーストし、複数のベクトル ポインターを作成する

次のコードを使用して、共有ベクトルを共有マップに挿入したいと考えています。

コードは機能します..しかし、私がやりたいのは、名前のないベクトルを構築することです。つまり、このようなことをします

そのため、ループ内に配置しても、ループごとに異なる名前を付けても問題ありません。そうする方法はありますか?または、少なくともループごとに異なる名前を付ける自動方法はありますか?

0 投票する
2 に答える
8072 参照

c++ - boost によって作成された共有メモリのパーミッションの設定

このような別のプロセスによって作成されたブースト共有メモリを開きます

しかし、共有メモリを作成したプロセスが root ユーザーである場合、それを読み取るプロセスは、通常のユーザーである場合、次の理由で失敗します。

これを避けるにはどうすればよいですか?つまり、共有メモリへのアクセスをすべての人に許可するということですか?