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

c++ - プロセス間メッセージ キューのブースト、開閉

書き込み (create_only) と読み取り (open_only) の 2 つのプロセスがあります。ライター プロセスが終了している場合は、キューを削除します。ただし、リーダーは try_receive を実行し続けることができ、例外を発生させたり、通知を有効にしたりしません。キューの存在を確認するための推奨される方法は何ですか?

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

c++ - 連続していないブロックをファイルから連続したメモリ アドレスにマッピングする

メモリ マップド IO を使用する可能性に興味があります。できれば、boost::interprocess の機能をクロスプラットフォーム サポートに利用して、ファイル内の連続していないシステム ページ サイズのブロックをメモリ内の連続したアドレス空間にマップすることに興味があります。

単純化された具体的なシナリオ:

私はいくつかの「plain-old-data」構造を持っています。それぞれが固定長 (システム ページ サイズよりも小さい) です。これらの構造は、構造のタイプと場所によって決定される (非常に長い) ストリームに連結されます。ストリーム内でそれらを進める構造の値。要求の厳しい同時実行環境で、待ち時間を最小限に抑え、スループットを最大化することを目指しています。

このデータをシステム ページ サイズの少なくとも 2 倍のブロックにメモリ マッピングし、最後から 2 番目のシステム ページ境界を超えて拡張された構造を読み取った新しいマッピングをすぐに確立することで、このデータを非常に効果的に読み取ることができます。これにより、単純な古いデータ構造とやり取りするコードは、これらの構造がメモリ マップされていることをまったく意識せずに済みます。たとえば、ページ境界を気にすることなく、直接 memcmp() を使用して 2 つの異なる構造を比較できます。

興味深いのは、これらのデータストリームを更新することです...それらが(同時に)読み取られている間。私が使用したい戦略は、システムページサイズの粒度での「コピーオンライト」に触発されています...本質的に「オーバーレイページ」を書き込みます-あるプロセスが古いデータを読み取り、別のプロセスが更新されたデータを読み取ることができます。

どのオーバーレイ ページをいつ使用するかを管理することは、必ずしも簡単なことではありませんが、それは私の主な関心事ではありません。私の主な懸念は、ページ 4 と 5 にまたがる構造を持っている可能性があることです。次に、ページ 5 に完全に含まれる構造を更新します...新しいページを場所 6 に書き込みます...到達不能と判断されました。つまり、ページ 4 を場所 M にマップする場合、既存の (non-memory-mapping-認識) 機能。

私は最善の戦略を確立しようとしていますが、文書が不完全であることに妨げられています。基本的に、アドレス空間の割り当てをメモリ マッピングからそのアドレス空間に分離する必要があります。mmap() を使用すると、MAP_FIXED を使用できることを認識しています-マッピングの場所を明示的に制御したい場合...しかし、これを安全に行うためにアドレス空間を予約する方法がわかりません。/dev/zero を MAP_FIXED なしで 2 つのページにマップし、次に MAP_FIXED を 2 回使用して、明示的な VM アドレスで割り当てられたスペースに 2 つのページをマップできますか? その場合、munmap() も 3 回呼び出す必要がありますか? リソースがリークしたり、その他の厄介なオーバーヘッドが発生したりしますか? 問題をさらに複雑にするために、Windows でも同等の動作が必要です... これを行う方法はありますか?クロスプラットフォームの野望を妥協する場合、適切な解決策はありますか?

--

あなたの答えをありがとう、マフムード...私は読んだ、そして私はそのコードを理解したと思う...私はそれをLinuxでコンパイルし、あなたが提案したように動作します。

私の主な関心事は 62 行目です - MAP_FIXED を使用しています。これは、mmap についていくつかの前提を置いていますが、私が見つけたドキュメントを読んでも確認できませんでした。「更新」ページを最初に返された mmap() と同じアドレス空間にマッピングしています - これは「正しい」と思います - つまり、たまたま Linux で動作するものではありませんか? また、ファイルマッピングと匿名マッピングのクロスプラットフォームで機能すると仮定する必要があります。

サンプルは間違いなく私を前進させます...私が最終的に必要とするものは、おそらく Linux の mmap() で達成可能であることを文書化しています - 少なくとも。私が本当に欲しいのは、サンプルが示すように MAP_FIXED 行が機能することを示すドキュメントへのポインターです...そして、理想的には、Linux/Unix 固有の mmap() からプラットフォームに依存しない (Boost::interprocess ) アプローチ。

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

c++ - オブジェクトの存続期間中、Boost upgradable_lockを保持するにはどうすればよいですか?

1つのプロセスが唯一のライターであり、多くのリーダーが存在するプロセス間通信用のクラスのペアを実装しています。1つのクラスが読み取りを処理します。1つは書き込みを処理します。他のプロセスがライターになるのを防ぐために、ライタークラスの単一のオブジェクトが必要です。このオブジェクトは、boost::named_upgradable_mutexその存続期間中、アップグレード可能なロックを保持します。boost::interprocess::upgradable_lockそのために、ライタークラスには、オブジェクトの構築時にミューテックスが渡されるタイプのメンバー変数があります。ライタープロセスが書き込むときは、ライタークラスのWrite()メソッドを呼び出します。このメソッドは、そのロックを排他的にアップグレードし、書き込みを実行し、排他ロックをアトミックに降格して、単に再度アップグレードできるようにする必要があります。

Move Semanticsを介したロック転送に関するBoostのドキュメントに従って、ライタークラスのWrite()メソッドに最初の部分(ロックを排他的にアップグレードする)を実装することができました。ただし、2番目の部分(ロックをアップグレード可能に降格)は、boost :: interprocess :: upgrade_lock型の新しいローカル変数を生成します。これは、スコープ外になり、Write()が戻ったときにミューテックスを解放します。そのアップグレード可能なロックをクラスのupgradable_lockメンバー変数に戻して、アップグレード機能がライターオブジェクトのみに残るようにする必要があります。これを行うための最良の方法は何ですか?私が思いついた唯一のことは、戻る前にローカル変数をメンバー変数と交換することです。コードは次のようになります。

これは機能しますが、その最後の行は本当に直感に反していて、考えるのに少し時間がかかりました。もっと良い方法はありますか?降格されたロックをメンバー変数に直接入れることは可能ですか?また、降格されたロックを格納するためにメンバー変数を再利用することの意図しない結果はありますか?

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

c++ - boost::interprocess を使用したリンカー エラーのコンパイル

boost::interprocess::container 文字列を共有メモリに書き込み、別の文字列を共有メモリから読み取る小さなプログラムを作成しました。

次のリンカ エラーが発生します。

私はまた、以下とリンクしようとしました:

しかし、これらのコマンドはどれも機能していません。この簡単な例をコンパイルする方法を教えてください。

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

c++ - boost :: interprocess::managed_shared_memoryがプログラムをクラッシュさせる

私の目標は、boost :: interprocess :: managed_shared_memoryを使用して、共有メモリ内のマップに特定のデータ構造を格納できるSharedMemoryというテンプレートシングルトンクラスを作成することです。

これがその使用方法の例です。

スタックトレースは次のとおりです。

私の現在の問題は、の呼び出しに対してプログラムがクラッシュすることmymap->begin()ですgetMapOfRecords()

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

mysql - mysql でのストアド プロシージャの同期実行

2 つのアプリケーションがストアド プロシージャを呼び出した場合、タスクを実行するためにコードのセクションにアクセスできるのは 1 つだけであり、他のアプリケーションは最初のアプリケーションまでブロックされるように、同期する必要があるタスクを実行するストアド プロシージャがmysqlにあります。 1つはタスクを完了します。

そのため、2 つのアプリケーションがストアド プロシージャを同時に呼び出す場合は、タスクを同期する必要があります。

を。しかし、 START TRANSACTIONCOMMITは実行を同期しませんでした。

b. また、LOCK TABLES tableAをストアド プロシージャで使用して同期を確保することもできません。

c. アプリケーション レベルでストアド プロシージャ コールを同期しようとしました。使った

boost_interprocess scoped_lock lock();

ブースト1.41で完全に機能しました

しかし、プロセス間ロックミューテックスは、boost 1.34 ライブラリではサポートされていません。これは、私の場合に利用できるものです。

コードのストアド プロシージャ セクションを同期して、2 つの呼び出しが同時に行われたときに、一方が実行される前に一方がブロックされるようにする方法はありますか?

(以下を追加)編集されたコード:ストアドプロシージャの同期ブロックで何を実行しようとしているのかを理解するため。

最後に割り当てられた ID を取得し、それを 1 つ増やして、それが別の「名前」レコードに使用されていないかどうかを確認します。有効な ID が見つかったら、最後に割り当てられた ID レコード テーブルを更新し、それを指定された「名前」に関連付けます。

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

c++ - boost::プロセス間メモリサイズ

次のように定義されmanaged_shared_memoryたマップコンテナを保持するオブジェクトがあります。SharedMap

私の問題は、使用している共有メモリのサイズを決定する必要があることです。マップのキーは不明なサイズのstd::stringであり、データは不明なサイズのテンプレートタイプであり、各データのサイズは異なります。

誰かが私が使用しているメモリを追跡する方法を提案できますか?

私はboost::interprocessを初めて使用するので、どんな提案も大いに役立ちます。

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

c++ - boost :: interprocess::map-タイプとしてbasic_stringを使用して値を更新する方法

私は次のコードを持っています:

誰かが最後の行の正しい構文を教えてもらえますか?最後の行でコンパイルエラーが発生します。

よろしくお願いします。

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

php - PHP とブースト ライブラリ IPC の間で通信するにはどうすればよいですか?

PHP でクライアントとサーバーが共有メモリを介して通信しています。Boost.Interprocess を使用してこのシュレッド メモリ オブジェクトにアクセスしたいのですが、どうすればアクセスできますか? サーバー.php:

client.php

このメモリ領域を取得するには、Boost にどのようなキーを提供する必要がありますか?

boost_client.cpp

編集:

Boost IPC ライブラリのドキュメントで解決策を見つけました。

boost ドキュメントの XSI_KEY ベースの例

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

c++ - boost::interprocess_mutex と比較して、共有メモリ内で boost::mutex を使用しないのはなぜですか?

しばらくの間、怒りの中でブースト共有メモリを学習して使用していたので、どのタイプのミューテックスをいつ使用するかのメンタルモデルにたどり着きました。それは次のようになります。

原則としてこれが間違っていないことを願っていますので、間違っている場合は修正してください。私の意図は、この図に準拠していない既存のコードと自分自身のコードを前進させて修正することですが、確実にしたいと思います。

この質問には 2 つの部分があります。本当に問題ないと思いますが、//2 を使用するのは無意味です。コンテキストでは、これは //1 よりも良くありませんが、その理由は何ですか? パフォーマンス?

//3 については、私の推測は正しいですか? 機能しない理由、または少なくともどのような状況では機能しないのか、技術的な舞台裏の理由を誰かが説明できますか?