0

単一のコンピューター端末から複数の医療機器を制御するために、少し複雑な通信プロトコルの一部をコーディングしています。コンピュータ端末は、このようなデバイスを約20台管理する必要があります。すべてのデバイスは、DEPと呼ばれる通信で同じプロトコルを使用します。ここで、さまざまなデバイス内で多重化してリクエストを送信し、特定のデバイスに関連付けられた患者データを受信するループを作成しました。したがって、このループの構造は、一般的に次のようになります。

Begin Loop
   Select Device i
      if Device.Socket has Data
         Strip Header
         Copy Data on Queue
      end if

      rem_time = TIMEOUT - (CurrentTime - Device.Session.LastRequestTime)
      if TIMEOUT <= 0
         Send Re-association Request to Device
      else
         Sort Pending Request According to Time
         Select First Request
            Send the Request
            Set Request Priority Least
         end Select
      end if
   end Select
end Loop

上記の擬似コードで間違いを犯した可能性がありますが、このループが何をしようとしているのかを明確にしたことを願っています。デバイスとそのデバイスの保留中のリクエストを選択する優先リスト構造を使用しているため、すべてのリクエストとデバイスが最適な間隔で選択されます。

上記のループは実際に受信したデータを解析しませんが、ヘッダーを取り除き、キューに入れるだけです。キュー内のデータは別のスレッドで解析され、ファイルまたはデータベースに記録されます。

他のコンピューターもデータをインポートして、コンピューター端末に接続されているデバイスをリモートで制御できるようにする機能を追加したいと思います。このために、このINFINITE LOOPでコマンドをリッスンし、PARSINGが実行される別のスレッドでデータを送信するソケットを作成する必要があります。

さて、すべての並行性の専門家への私の質問は、次のとおりです。2つの異なるスレッドでの読み取りと書き込みに単一のソケットを使用するのは良い設計ですか?各スレッドが、両方ではなく読み取りまたは書き込みのいずれかに厳密に関与する場合。また、ソケットはプロセスレベルで同期されていると思いますが、異なるスレッドからの1つのソケットで読み取りと書き込みを同期するには、ロックが必要ですか?

4

1 に答える 1

0

複数のスレッドが単一のソケットを処理することに本質的に問題はありません。ただし、この1つの非常に一般的なアイデアに基づいた多くの良いデザインと悪いデザインがあります。アプリケーションをコーディングするときに問題を再発見したくない場合は、計画している特定のスタイルのパケット処理に最適な設計を探し回ることをお勧めします。

また、単一のスレッドが単一のソケットを処理することには本質的に問題はありません。ただし、そのスレッドにロジック処理を配置した場合は、不適切な設計を選択したことになります。これは、そのスレッドが最後の要求で「機能」している間は要求を処理できないためです。

特定のコードで、問題が発生している可能性があります。パケットがフラグメンテーションをサポートしている場合、またはタイミングの問題のためにアルゴリズムがハードウェアより少し進んでいる場合でも、パケットの一部だけがバッファに「受信」されている可能性があります。その場合、アルゴリズムは2つの方法で失敗します。

  1. データの最初の部分を含む部分的なパケットを処理します。
  2. バッファ内の情報が有効なパケットヘッダーで始まらないため、後続のパケットが誤って処理されます。

このような障害は、発生するまでは想像して診断するのが困難です。おそらく、ライブラリはすでにメッセージをバッファリングして分割していますが、そうではないかもしれません。

要するに、あなたのデザインはあなたのソケットにアクセスしているスレッドの数によって決定されません:あなたのソケットにアクセスするスレッドの数はあなたのデザインによって決定されます。

于 2012-05-08T22:52:00.513 に答える