2017-11-13 32 views
0

Windows環境でC/C++でプロセス間通信をしようとしています。クロスプロセスミューテックス読み取り/書き込みロック

私は共有メモリページファイルを作成しており、2つのプロセスがそのファイルのハンドルを取得しています。これは次のようなものです。

Process1:共有メモリ領域を初期化します。 Process2がそれを埋めるのを待ちます。

処理2:共有メモリ領域へのハンドルを取得します。それに食べ物を入れる。

私もprocess1に名前付きミューテックスを作成しています。これで、process1は、作成した直後に(WaitSingleObjectを使用して)mutexの所有権を取得します。明らかに、メモリ領域には何もないので、私はミューテックスを解放する必要があります。今度は、ミューテックスを再度取得しようとするのではなく、メモリがいっぱいになるまで待つ必要があります。

私は条件変数を考えていました。 Process2は、メモリ領域を一度埋めると状態変数に信号を送り、process1は情報をすぐに取得します。

しかし、条件変数に関するMSのドキュメントによれば、それらはnamedではないため、初期化から明らかなプロセス間で共有されません。

さらに、共有メモリ領域は任意の時点で1つの要素を保持することができます。つまり、process2は、process1がその情報を抽出しない限り、fill2の後に再充填できません。

この説明から、条件変数がこの目的(またはモニタ)に最適であることは明らかです。それでは、これを回避する方法はありますか?

+0

セマフォー........ 2つのセマ、A、B、0を0に初期化します。P1はAを待ちます.P2はバッファを埋めます。 P2信号Aを受信し、Bを待つ.P1はバッファデータを処理し、次に信号BおよびループバックしてAを再び待機する。 –

+0

@MartinJames私はそれらを使いたかったのですが、条件変数のようには機能しません。ミューテックスは本質的にカウントが1に設定されたセマフォです。私は所有権を待つのではなく、信号を待つ必要があります。私がセマフォを使用した場合、私はmutexを使用するのと同じように所有権を取得します。誰かが私に信号を送るまで、私は所有権を望んでいません。 – Everyone

+0

'ミューテックスは本質的にカウントが1に設定されたセマフォーです。 –

答えて

0

ミューテックス(ほとんどの同期プリミティブ)は、同じプロセス内で異なるスレッドによって使用されるプロセスごとのオブジェクトです。プロセス間で共有することはできません(少なくともUnixでは)。

さまざまなプロセス間で物事を同期させるには、通信にいくつかのIPCメカニズムを使用する必要があります。

+1

本当にそうではありません。 Windows APIには、プロセス間で共有できる 'named-mutex'があります。私の質問から、私はIPCを実装しようとしていて、既存のメカニズムを使用していないことは明らかです。 – Everyone

+0

"mutexオブジェクトを使用して、共有リソースを複数のスレッドまたはプロセスが同時にアクセスするのを防ぐことができます。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms686927(v=vs.85).aspx – Everyone

+0

@すべての大丈夫、私の答えは少しすぎるようです。Unix centric - 私はしません。 Windowsはかなりです。ごめんなさい。 –

1

条件変数はプロセス内で使用できますが、プロセス間では使用できません。

オープンモードとしてPIPE_ACCESS_DUPLEXでNamedPipeを試してください。あなたは両方のプロセスから通信オプションを持つことができます。私はこの前のイベントを使用している

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365150(v=vs.85).aspx

0

。 2つの名前付き自動リセットイベントを使用します。 1データ準備完了イベントと1つのバッファ準備完了イベントがあります。ライタは、バッファレディを待って、データを書き込み、データレディイベントを設定します。リーダーは、データ準備完了イベントを待機し、メモリーを読み取り、バッファー・レディ・イベントを設定します。正しく実行された場合は、ミューテックスは必要ありません。

+0

「悪い人のセマフォ」:) –

関連する問題