0

プロセス間通信に名前付きパイプを使用する win32 アプリを作成しています。1 つのプロセスが writeFile を試行すると、構造体が書き込まれ (他のプロセスにバイト数とその他の情報が伝えられます)、WriteFile を再度呼び出して実際のデータが書き込まれます。

もう一方のプロセスは、読み取り中に最初のメッセージを読み取り、最初のメッセージから取得した情報に基づいて 2 番目のメッセージを読み取ります。

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

  1. サーバー プロセスがデータを書き込んでいるが、クライアント プロセスがまだそれを読み取っていない場合、クライアントが読み取っているときに最初のメッセージが失われる可能性はありますか? たとえば、サーバーが 2 回目に WriteFile を呼び出して実際のデータを書き込む場合、前のメッセージは上書きされますか?

  2. waitforsingleobject を使用して同期する最善の解決策はありますか?

ありがとう

4

1 に答える 1

3

パイプは実際のパイプに少し似ています。パイプにさらに書き込みを行っても、既にパイプにあるものは上書きされません。以前にパイプに書き込んだデータの後に配信されるデータをパイプに追加するだけです。

WaitForSingleObjectパイプに役立つことはめったにありません。パイプからデータを受信するまで現在のスレッドをブロックしたい場合は、同期読み取りを行うだけで、データが存在するまでブロックされます。多数のソースのいずれかからの入力があるまでブロックする場合は、通常、WaitForMultipleObjectsまたはが必要MsgWaitForMultipleObjectsなため、いずれかのソースに処理する入力があるとスレッドが実行されます。

パイプでの使用を思い出すことができるのWaitForSingleObjectは、タイムアウトがゼロだったときだけだったので、パイプ入力がない場合、レシーバーは他の処理を続行し、パイプに処理するデータがあるかどうかを時々チェックします。PeekNamedPipe最初はこれでうまくいくように見えますが、実際には他の目的に最も役立ちます。ただし、ヘッダーデータを読み取り、メッセージ全体を読み取って処理するために呼び出す他のコードを把握するために機能する場合もあります。

そうは言っても、名前付きパイプを使用した新しいコードをかなり長い間書いていないことを指摘しなければなりません。今日、それらを検討する状況はほとんど考えられません。ほとんどの場合、代わりにソケットを使用していました。

于 2013-02-18T23:18:01.607 に答える