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

c++ - Boost.Interprocessのmanage_shared_memory.construct()にパラメーターを渡す方法

私はBoost.Interprocessのドキュメントを何時間も見つめてきましたが、それでもこれを理解することができませんでした。ドキュメントには、次のように共有メモリにベクターを作成する例があります。

今、私はこれを理解しています。私が立ち往生しているのはsegment.construct()、要素の数を指定するために2番目のパラメーターを渡す方法です。construct()プロセス間ドキュメントは、としてのプロトタイプを提供します

でもやってみると

コンパイルエラーが発生します。

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

  1. オブジェクトのコンストラクターである、par1, par2からパラメーターを実際に渡されるのは誰ですか。私の理解では、テンプレートアロケータパラメータが渡されています。あれは正しいですか?segment.constructvector
  2. alloc_inst共有メモリに作成されているオブジェクトのコンストラクターに必要なパラメーターに加えて、別のパラメーターを追加するにはどうすればよいですか?

これに関する簡潔なBoostドキュメント以外の情報はほとんどありません。

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

c++ - Boost iostreamマップトファイルとBoostプロセス間マップトファイルに違いはありますか?

マップされたバイナリファイルをメモリに作成したい。ただし、システムにマップするファイルを作成する方法がわかりません。ドキュメントを数回読んで、2つのマップトファイルの実装があることに気付きました。1つはiostreamにあり、もう1つはプロセス間にあります。

マップされたファイルを共有メモリに作成する方法について何か考えがありますか?マルチスレッドプログラムがバイナリファイル形式で記述された大きなdoubleの配列を読み取れるようにしようとしています。また、iostreamとinterprocessのマップされたファイルの違いは何ですか?

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

c++ - Boost.MultiIndex: 2 つのプロセス間でオブジェクトを共有する方法はありますか?

約 10Gb の Boost.MultiIndex 大きな配列があります。読み取りを減らすために、データをメモリに保持する方法が必要であり、別のクライアントプログラムがそれを読み取って分析できるようになると思いました。

それを整理する適切な方法は何ですか?

配列は次のようになります。

どんなアイデアでも大歓迎です。

よろしくアルマン。

編集: RAM とコアの数は制限されていません。現在、私は 16Gb と 8 コアを持っています。

アップデート

Boost.Users フォーラムで尋ねていたのと同じ質問で、Joaquín M López Muñoz (Boost.MultiIndex の開発者) から回答を得ました。答えははいです。Boost.Interprocess を使用して、プロセス間で multi_index を共有できます。詳細については、このリンクで確認できます

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

c++ - C ++アロケータ、具体的には、boost :: interprocess::cached_adaptive_poolで割り当てられたオブジェクトにコンストラクター引数を渡します

これは恥ずかしい質問ですが、boost.interprocessで提供されるよく書かれたドキュメントでさえ、これを行う方法を理解するのに十分ではありませんでした。

私が持っているのはcached_adaptive_poolアロケータインスタンスであり、これを使用してオブジェクトを構築し、コンストラクターパラメーターを渡します。

これは、一般的なアロケータオブジェクトの使用方法に関する私の側の失敗である可能性が非常に高いです。しかし、いずれにせよ、cached_adaptive_poolで指定されたインターフェイスを使用して、この特定のアロケータを使用してコンストラクター引数をオブジェクトに渡す方法がわかりません。

cached_adaptive_pool方法があります:void construct(const pointer & ptr, const_reference v)しかし、それが何を意味するのか理解できず、それを使用した例を見つけることができません。

私の頭は一日中テンプレートで泳いでいるので、答えが明白であっても、助けの手は大いに感謝されます。

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

c++ - Boost::Interprocess コンテナ コンテナのサイズ変更 デフォルトのコンストラクタなし

Boost::Interprocess のドキュメントと Google 検索をくまなく調べた後、問題の理由/回避策を見つけたと思います。私が理解しているように、私が見つけたものはすべてこれを暗示しているようですが、出てきて「これを行う理由は...」とは言いません。しかし、誰かがこれを確認できるなら、私はそれを感謝します.

並列化されたアプリケーションで高速なパフォーマンスを実現するためにメモリに格納される大量の情報を表す一連のクラスを作成しています。1 台のマシンで同時に実行されるデータと複数のプロセスのサイズのため、共有メモリに Boost::Interprocess を使用して、構造の単一のコピーを保持しています。

Boost::Interprocess のドキュメントと例を見たところ、共有メモリ文字列、文字列ベクトル、int ベクトル ベクトルなどのクラスを型定義していました。例でそれらを「使用」するときは、アロケータを渡して構築するだけで、多分彼らが他の場所で構築した1つのアイテムを挿入します。このページのように: http://www.boost.org/doc/libs/1_42_0/doc/html/interprocess/allocators_containers.html

そこで、彼らの例に従って、共有メモリ クラスの typedef を含むヘッダー ファイルを作成しました。

次に、ルックアップ テーブル クラスの 1 つについて、次のように定義します。

しかし、コンパイルすると、次のエラーが発生します。 'boost::interprocess::allocator<T,SegmentManager>::allocator' : no appropriate default constructor available

resize()これは、ベクター オブジェクトの呼び出しによるものです。型にはallocator空のコンストラクターがなく ( を受け取るconst segment_manager_t &)、各場所の既定のオブジェクトを作成しようとしているためです。したがって、それが機能するためには、アロケーター オブジェクトを取得し、デフォルト値オブジェクトを に渡す必要がありますresize。このような:

これは最善/正しい方法ですか?それとも私は何かを逃していますか。

ありがとう!

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

c++ - boost::interprocess::message_queue がビジュアル C++ のリリース モードで動作しなくなる

私はboost::interprocess::message_queueをVC++で使用しています(Microsoft Visual Studio 2005)。デバッグモードでは正常に動作しています。次に、プログラムをリリース モードでコンパイルすると、動作が停止し、「try_send」を呼び出すたびに false が返されます。リリース モードとデバッグ モードで異なる設定が何であるかがわかりません。これにより、キューが機能しなくなります。

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

c++ - Boost::プロセス間共有メモリ バス エラー

Open-MPI 1.3.3 を使用するクラスターで CentOS 5.4 x86_64 と Boost 1.42.0 を使用しています。共有メモリを使用して、複数のプロセスが使用する大量のデータを格納する共有ライブラリを作成しています。ファイルからデータを読み取り、共有メモリにロードするローダー アプリケーションもあります。

ローダー アプリケーションを実行すると、データを正確に格納するために必要なメモリ量が決定され、オーバーヘッドが 25% 追加されます。ほぼすべてのファイルで、2 ギガ以上のデータになります。Boost の Interprocess ライブラリを使用してメモリ要求を行うと、要求された量のメモリが正常に予約されたと表示されます。しかし、使用開始を使用すると、「バスエラー」が発生します。私が知る限り、バス エラーは、メモリ セグメントで使用可能な範囲外のメモリにアクセスした結果です。

そこで、Linux で共有メモリがどのようになっているのか、システムが大量の共有メモリを許可するように正しく構成されていることを確認するために何をチェックすればよいのかを調べ始めました。

  1. 私は次の「ファイル」を見ました/proc/sys/kernel/shm*
    • shmall- 4294967296 (4GB)
    • shmmax- 68719476736 (68GB)
    • shmmni- 4096

  2. 私はipcs -lmコマンドを呼び出しました:

私が知る限り、これらの設定は、目的に十分な共有メモリを割り当てることができるはずであることを示しています。そこで、共有メモリに大量のデータを作成する単純なプログラムを作成しました。

次の行でコンパイルしました:

次に、次の出力で実行しました(小さくするために編集しました):

a パラメーターを指定してプログラムを実行すると (どれでも機能しますが、 を増やすだけで済みますargc)、ベクターは事前に割り当てられますが、同じ配列インデックスでバス エラーが発生します。

次のコマンドを/dev/shm使用して、「ファイル」のサイズを確認しました。ls -ash /dev/shm

元のアプリケーションと同様に、割り当てられた共有メモリのサイズは 2 ギガに制限されています。2352000000 バイトのメモリが "正常に" 割り当てられたとすると、ギガバイト単位 (1024*1024*1024 を使用) は 2.19 Gb になるはずです。

実際のプログラムを実行して MPI を使用してデータをロードすると、次のエラー出力が表示されます。

これでどこに行くべきか本当にわかりません。何を試してみるべきかについて何か提案はありますか?


Boost バグ トラックに投稿: https://svn.boost.org/trac/boost/ticket/4374

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

c++ - boost::interprocess はプライムタイムの準備ができていますか?

私は、Boost Interprocess をかなり頻繁に使用するメモリ マップ ファイルに支えられたスレッド セーフ キューに取り組んでいました。私はそれをコードレビューに提出しましたが、この地球上で私よりも長い経験を持つ開発者は、boost::interprocess が「プライムタイムの準備ができている」とは感じておらず、pthreads を直接使用する必要があると述べました。

それはほとんどFUDだと思います。個人的には、upgradable_named_mutex や boost::interprocess::deque などを再実装するのはばかげているとは思いませんが、他の人がどう思うか知りたいです。彼の主張を裏付けるデータを見つけることができませんでしたが、おそらく私は知識がないか、単純なだけです. Stackoverflow 教えてください!

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

c++ - C ++ BOOST:Windows共有メモリget_size()はゼロを返します

以下は、公式のBOOSTドキュメントからのものです。呼び出し時に常にサイズがゼロになるのはなぜregion.get_size()ですか?私は何が間違っているのですか?

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

c++ - Boost::複雑なネストされたクラスとのインタープロセス

ようやくboost:interprocess ライブラリの基本を理解できたと思います。すべて標準データ型であるいくつかのメンバー変数を含む比較的単純なクラスを扱うときに、これをうまく使用しています。

ただし、かなり複雑なクラスをプロセス間共有メモリにプッシュするという問題に直面しており、まったく運がありません。ここの誰かが助けてくれることを願っています(または、別の解決策に向けて私を導くことができます)。私が基本であることを望むものにそれを取り除いて、私はこれらの線に沿って何かを持っています:

複数のプロセスがデータにアクセスできるように、プロセス間メモリ空間に SharedClass オブジェクトのベクトルを作成する必要があります。どう頑張っても解決策が見つからないようです。プロセス間バージョン (interprocess::vector、interprocess::string、offset_ptr など) の途中ですべてのメンバー変数を作成するよりも簡単な方法があるようですが、そうでない場合もあります。それでも、GSL ライブラリ構造は言うまでもなく、すべてのアロケータなどを処理する方法がわかりません。

ヘルプ!