問題タブ [shared-memory]

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 投票する
3 に答える
4254 参照

go - 共有メモリ対 Go チャネル通信

Go のスローガンの 1 つは、メモリを共有して通信しないでください。代わりに、通信によってメモリを共有します

私は、Go が同じマシン上で実行されている 2 つの異なる Go コンパイル済みバイナリを相互に通信できるようにするかどうか (つまり、クライアント サーバー) と、C++ の boost::interprocess と比較してどれくらい高速になるかを考えています。これまで見てきたすべての例は、同じプログラム ルーチン間の通信を示しているだけです。

シンプルな Go の例 (個別のクライアント コードとサーバー コードを使用) をいただければ幸いです。

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

windows - MapViewOfFileEx への複数回の呼び出しで失敗することなく、アドレス空間を再利用できますか?

Windows XP の 32 ビット アドレス空間内で実行されている、複雑でメモリを大量に消費するマルチ スレッド アプリケーションを考えてみましょう。

特定の操作では、一度にアクセスする必要があるバッファは 1 つだけである、固定サイズの n 個の大きなバッファが必要です。

アプリケーションは、1 つのバッファーのサイズのアドレス空間が早期に予約され、現在必要なバッファーを格納するために使用されるパターンを使用します。

これは次の順序に従います: (最初の実行) VirtualAlloc -> VirtualFree -> MapViewOfFileEx (バッファの変更) UnMapViewOfFile -> MapViewOfFileEx

ここでは、バッファーの場所へのポインターが VirtualAlloc への呼び出しによって提供され、その同じ場所が MapViewOfFileEx への呼び出しごとに使用されます。

問題は、ウィンドウが (私が知る限り) 異なるユーザー間でメモリ空間を渡すためのハンドシェイク タイプの操作を提供しないことです。

したがって、メモリがロックされず、別のスレッドがジャンプしてバッファ内で割り当てを実行できる小さな機会があります (上記の各シーケンスで ->)。

MapViewOfFileEx への次の呼び出しは壊れており、システムはアドレス空間にバッファ用に十分な大きさの空間があることを保証できなくなりました。

より小さなバッファーを使用するようにリファクタリングすると、スペースの再割り当てに失敗する率が明らかに低下します。

HeapLock の一部の使用はある程度成功していますが、これにはまだ問題があります。何かがまだアドレス空間内からメモリを盗むことができます。(GetProcessHeaps を呼び出してから、HeapLock を使用してすべてのヒープをロックしようとしました)

MapViewOfFileEx と互換性のあるアドレス空間の特定のブロックをロックする方法はありますか?

編集:最終的にこのコードは、私の制御外のアプリケーションによって呼び出されるライブラリに存在することを追加する必要があります

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

c# - c#で実行中の別のアプリケーションで変数をクエリするには?

起動時に、それ自体の重複プロセスをチェックするアプリがあります。

その部分は正しいですが、必要なのは、ロジックを実行するために、元の実行中のプロセスの状態変数をチェックすることです。

では、変数 (bool など) を他のアプリケーションで公開してクエリできるようにするにはどうすればよいでしょうか?

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

c++ - C ++:std :: vectorの共有メモリアロケータはいつ必要ですか?

First_Layer

私はVC++6サービスパック6で書かれたwin32dllを持っています。このdllをFirstLayerと呼びましょう。FirstLayerのソースコードにアクセスできませんが、マネージコードから呼び出す必要があります。問題は、FirstLayerが関数の引数としてstd::vectorとstd::stringを多用し、これらの型をC#アプリケーションに直接マーシャリングする方法がないことです。

Second_Layer

私が考えることができる解決策は、最初にVC++6サービスパック6で記述された別のwin32dllを作成することです。このdllを「SecondLayer」と呼びましょう。SecondLayerはFirstLayerのラッパーとして機能します。このレイヤーにはstd::vectorのラッパークラスが含まれているため、std::vectorはこのレイヤーのすべての関数パラメーターで公開されません。std::vectorのこのラッパークラスをStdVectorWrapperと呼びましょう。

このレイヤーは、メモリの割り当てまたは割り当て解除にnewまたはdelete操作を使用しません。これは、内部でstd::vectorによって処理されるためです。

Third_Layer

また、SecondLayerのラッパーとしてVC++2005クラスライブラリを作成しました。このラッパーは、アンマネージドSecondLayerをマネージドコードに変換するという汚い仕事をすべて行います。このレイヤーを「ThirdLayer」と呼びましょう。

SecondLayerと同様に、このレイヤーはStdVectorWrapperを処理するときにnewとdeleteを使用しません。

Four_Layer

さらに、ThirdLayerを呼び出すC#2005コンソールアプリケーションを作成しました。このC#コンソールアプリケーションを「FourthLayer」と呼びましょう。

呼び出しシーケンスの概要

FourLayer(C#2005)-> ThirdLayer(VC ++ 2005)-> SecondLayer(VC ++ 6)-> FirstLayer(VC ++ 6)

問題

System.AccessViolationException:保護されたメモリの読み取りまたは書き込みを試みました」例外がスローされていることに気付きました。これは、SecondLayerの内部std :: vector割り当てメモリが原因で、ThirdLayerがアクセスするのは不正であると思われます。

これは、VC ++ 2005でFirstLayer(シミュレート)とSecondLayerを再コンパイルすると、問題が完全に解消されるためだと思います。ただし、ソースコードがないため、FirstLayerの製品版を再コンパイルすることはできません。

この問題を解決するには、StdVectorWrapperクラスにあるSecondLayerのstd::vector用の共有メモリアロケータをC++で作成する必要があると聞いています。共有メモリアロケータが必要な理由とその仕組みを完全に理解していませんか?何か案が?

コンパイルしてSecondLayerのコードと一緒に使用できる、インターネット上ですぐに利用できるソースコードはありますか?

これにはブーストライブラリを使用できないことに注意してください。

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

c - 64 ビット共有メモリ セグメント C \ Linux の問題

C \ Linuxで共有メモリセグメントを使用してIPCを実行しようとしています。

私は通常のようにそれを作成し続けます:

...

最後の行はそれが壊れている場所で、コンパイル時に次のようになります:

このコードが32ビットマシンで完全に機能する前に行ったことから(警告なし)(まったく同じコードをテストしていませんが、同じです)、64ビットではコンパイル時にこの警告が表示されます。

そして、実行時にセグメンテーション違反を起こします。私が行った調査から、void* からポインターへのキャストは、64 ビットの原因から、ポインターを混乱させると考えています。

どうすればこの人を修正できますか?または何が原因ですか?

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

.net - これらのIPC技術をどのように行うことができますか?

Cとwin32を使用していた当時、私は多くのIPC技術を持っていたのを覚えています。これまでのところ、.NETでそれらのいずれにも遭遇したり、Cの外部でそれらを見たりしたことがないので、これらのプロセス間通信技術をどのように行うことができるかを尋ねると思いました。

  1. 共有/グローバルメモリ。信号なしで別のプロセスによって変更できるRAMを割り当てるだけです。

  2. ウィンドウメッセージ。SendMessageとWM_USER+Nを使用したことを覚えています。共有メモリに触れたときに別のアプリに伝え、ファイルや設定を変更するように依頼し、ときどき怠惰な気分になるため、キーストロークを入力してマクロとして機能するように他のアプリに伝えました。

  3. 動的データ交換。私は試しましたが、これを機能させることはできませんでした。私が覚えていることから(これは完全に間違っている可能性があることを警告します)、あなたは自分自身をグローバルメッセージまたはイベントに登録し、別のアプリ(通常はあなたのもの)がメッセージを送信し、2つほどのアプリが互いに通信し、メッセージを投稿し、統合することができますこのように2つのアプリ間。何がこれに取って代わったのか知りたいです。

私が知っている名前付きパイプもまだ使用され、見られています。そして、私は人々がIPCにソケットを推奨していることを覚えていますが、私はそれをするのが好きではありませんでした。

他に何が欠けていて、何がこのテクニックに取って代わりましたか?かっこいいグローバルミューテックスがあることは知っています。私はまだ2つのアプリ間でメッセージを送信するための最新の方法を探しています(ポイント2)。パイプにないFIFOキューがあるのではないかといつも思っていました。毎回メッセージを送信してグローバルメモリを割り当てる代わりに、データ(1kなど)をプッシュできることを除いて、Windowsメッセージと同様です。

-編集-バンプ。このスレッドは、現時点ではまだ私に関連しています。

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

windows - サービスとアプリケーションの間でデータを渡すための好ましい方法は何ですか

重複の可能性:
Delphi 2009:VistaでWindowsサービスとデスクトップアプリケーション間で通信するにはどうすればよいですか?

サーバーをWindowsサービスとして実行しています。サービスを制御し、その状態を表示するために、アプリケーションをトレイアイコンとして実行しています。サービスからアプリケーションにデータ(ログ文字列)を渡したいのですが。

これを行うための最良の方法は何ですか?

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

c - IPC で 2D 配列を共有メモリとして割り当てることはできますか?

IPC を使用して、共有メモリを 2D 配列として割り当てたいと考えています。私は次のことを試しました:

問題は、マトリックスに何かを書き込もうとすると、セグメント フォールトが発生することです。