問題タブ [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 投票する
2 に答える
13096 参照

c++ - ブーストアップグレード可能なミューテックスの使用方法の例

いくつかの共有メモリ上でミューテックスロックを必要とするマルチスレッドサーバーアプリケーションがあります。

共有メモリは基本的にsTLマップなどです。

多くの場合、私は地図から読んでいます。しかし、私も時々それに追加する必要があります。

例:typedef std :: map MessageMap; MessageMap msgmap; boost:shared_mutex access_;

編集:私は異なるロックタイプを混乱させるかもしれません。

共有/アップグレードと排他の違いは何ですか。つまり、説明がわかりません。たくさんの読者を許可したいだけなら、共有アクセスだけを取得したいようです。また、共有メモリに書き込むには、アップグレードアクセスが必要です。それとも排他的ですか?ブーストの説明は明確ではありません。

あなたが書くかもしれないので、アップグレードアクセスは得られますか?しかし、共有とは、あなたが間違いなく書かないことを意味します。それはそれが何を意味するのでしょうか?

編集:私がやりたいことをもう少し明確に説明しましょう。私はまだ答えに満足していません。

これがもう一度例ですが、私が使用しているコードの例もあります。実際のコードではなく、単なる説明です。

0 投票する
3 に答える
17082 参照

c++ - C ++でBoostを使用して、セマフォに似たものを実現するにはどうすればよいですか?

ブーストがセマフォをサポートしていないように見えることに気づきました。同様の効果を達成するための最も簡単な方法は何ですか?

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

c++ - ブーストインタープロセスを使用して共有オブジェクトのベクトル要素にアクセスする

ブースト インタープロセス ライブラリの仕組みを理解しようとしています。ベクターコンテナに整数値を保持する Equipment クラスがあります。

親の親プロセスで。MySegmentObjectセグメントでEquipment オブジェクトを作成し、このオブジェクトのコンストラクターでMySegmentVectorセグメントにベクターを作成しました。

子プロセスの使用; 作成したオブジェクトにアクセスしてベクターのサイズを取得したい。メソッドを使用してオブジェクトにアクセスできますが、アクセスしたオブジェクトからメソッドsegment->findを呼び出すと、getSize()クラッシュします!

おそらく、共有メモリの概念について sth がありません。

Visual Studio 2010 & boost 1.43.0 libでコードをテストしました

機器.h

機器.cpp

メイン.cpp

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

c++ - 整数識別子を使用して共有メモリ上にオブジェクトを構築する

ブースト インタープロセス ライブラリのサンプルを見ると、オブジェクトは常に文字列名で構成されています。

のような整数識別子でオブジェクトを構築することは可能ですか?

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

c++ - boost::function をシリアライズして message_queue に送信する方法

boost::interprocess::message_queue で共有したいので、boost::serialize を使用して実際に boost::function をシリアル化しようとしています。それを行う方法は 1 つしかありません。非侵入型の boost::serialize を使用することです。

また、vtable と functor をシリアル化する必要があります。試していません。動作しているかどうかはわかりません。

boost::function を適切な方法でシリアル化する方法はありますか?

ありがとうございました。

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

c++ - ブーストプロセス間ライブラリの問題

誰かがこのfindメソッドの定義を教えてもらえますか?

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

c++ - boost::interprocess::mapped_region が変更されたときのスレッド通知

boost::interprocess::mapped_region のバイトが interprocess_condition を使用して変更されたときに通知を受け取るにはどうすればよいですか。

ファイルを開き、特定の地域を正しくマッピングしました。メモリをポーリングして印刷すると、更新は成功しています。継続的にポーリングするのではなく、変更の通知を受け取りたいと思っています。

interprocess_condition を使用して、メモリが変更されたことをスレッドに通知するにはどうすればよいですか?

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

c++ - Boost.Interprocess:別のプロセスにあるクラスから関数を呼び出してデータを送信する方法は?

したがって、スレッドで機能する単純なクラスを作成しました。任意のクラスの void 関数を、提示されたクラスから継承するクラスのサブスクライブ関数のリストに追加できます。

購読する必要があるのは次のとおりです。

スレッドを扱う場合、これは簡単です。たとえば create_thread をいつでも呼び出すことができ、必要なことはすべて他のアプリ スレッドで行うことができます。

しかし、app1 app2 と app3 があり、あるプロセスから関数のポインターを共有し、ブローカー アプリを使用してそのポインターを別のアプリに渡して、最後のプロセス/アプリからのパラメーターで呼び出すことができるとしたらどうでしょうか?

実際には、編集可能なテキスト フィールドが実行されていないアプリと、編集可能なテキスト フィールドが実行されているアプリがあるとします。そして、編集可能なTFから編集不可能なTFへの入力を接続できるアプリ№3がありました。

Boost.Interprocessで可能で、そのようなことを行う方法はありますか?

私はC ++にかなり慣れていませんが、関連する悪い情報を見つけたと思います:

参照禁止

参照は、ポインターと同じ問題を抱えています (主に参照がポインターとして実装されているため)。ただし、現在 C++ で完全に機能するスマート参照を作成することはできません (たとえば、operator .() はオーバーロードできません)。このため、ユーザーがオブジェクトを共有メモリに配置したい場合、オブジェクトはメンバーとして (スマートであるかどうかに関係なく) 参照を持つことはできません。

参照は、メモリ セグメントを共有するすべてのプロセスで、マップされた領域が同じベース アドレスにマップされている場合にのみ機能します。ポインターと同様に、マップされた領域に配置された参照は、そのマップされた領域のオブジェクトのみを指す必要があります。

仮想性の禁止

仮想テーブル ポインタと仮想テーブルは、オブジェクトを構築するプロセスのアドレス空間にあるため、仮想関数または仮想基底クラスでクラスを配置すると、共有メモリに配置された仮想ポインタは他のプロセスに対して無効になり、彼らはクラッシュします。

各プロセスには異なる仮想テーブル ポインタが必要であり、そのポインタを含むオブジェクトは多くのプロセスで共有されるため、この問題を解決するのは非常に困難です。マップされた領域をすべてのプロセスで同じアドレスにマップしたとしても、仮想テーブルはすべてのプロセスで異なるアドレスになる可能性があります。プロセス間で共有されるオブジェクトの仮想関数を有効にするには、コンパイラの大幅な変更が必要であり、仮想関数のパフォーマンスが低下します。そのため、Boost.Interprocess には、プロセス間で共有されるマップされた領域で仮想関数と仮想継承をサポートする計画はありません。

静的クラス メンバーに注意する

クラスの静的メンバーは、クラスのすべてのインスタンスによって共有されるグローバル オブジェクトです。このため、静的メンバーはプロセス内のグローバル変数として実装されます。

静的メンバーでクラスを構築する場合、各プロセスには静的メンバーの独自のコピーがあるため、あるプロセスで静的メンバーを更新しても、別のプロセスの静的メンバーの値は変更されません。したがって、これらのクラスには注意してください。静的メンバーは、プロセスの開始時に初期化される単なる定数変数である場合は危険ではありませんが、まったく変更されず (たとえば、列挙型のように使用される場合)、その値はすべて同じです。

しかし、1 つの同じライブラリを使用してすべてのアプリを作成しています。最高のパフォーマンスが必要な場合はスレッドを使用しますが、プロセス間通信が必要になる場合があります。では、どうすればよいでしょうか - 必要な機能をエミュレートするメカニズムを作成するにはどうすればよいでしょうか?

0 投票する
6 に答える
2339 参照

c++ - boost::interprocess::shared_ptr はスレッドセーフ (およびプロセス間セーフ) ですか?

スレッド間でデータを共有し、最後のユーザーがデータを使い終わったときに自動的に削除したいと考えています。これは、ほとんどの場合、セグメントで使用boost::interprocess::shared_ptrするとboost::fixed_managed_shared_memory機能するようですが、常にではありません。

では、boost::interprocess::shared_ptrスレッド (およびインタープロセス) は安全ですか?

固定アドレスで共有メモリを使用している場合 (これは 64 ビット (まあ、48 ビット) アドレス空間では問題ないと確信しています)、通常のboost::shared_ptr(これはスレッドセーフ) 代わりに?

明確化:

私が使用するポインター型は plainvoid*です (私の共有メモリーは固定アドレスにマップされています)。

スレッドセーフの問題は、参照カウントに関するものです。つまり、異なるプロセスで同時に同じものへの共有ポインタをコピー/破棄することが許可されているかどうかです。異なるスレッドで同じ共有ポインタにアクセスしないでください。また、ポインティにアクセスしないでください。

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

c++ - IPC セキュリティの名前付きパイプ

アプリで名前付きパイプを使用したいと考えています。サーバーは NT サービス、クライアントはユーザー空間アプリです。誰かがパイプ(または何か)をロックするアプリケーションクライアントを作成でき、サーバーがメッセージの受信を停止すると、問題が発生する可能性があると思います。

クライアントは常にメッセージを送信し、サーバーはそれらを受信する必要があることを追加したいと思います。誰かがそのプロセスを妨害すると、問題が発生します。

名前付きパイプを保護する方法についてアドバイスが必要です