0

私は次のことをしたい:

私は何台かのコンピュータを持っています。各コンピューターでプログラムが実行されます。集中サーバーはありません。

プログラムは、定義された基準によって選択して、別のコンピューターに指定されたデータを与えることができます。そうしている間、他のコンピューターは同じことをしてはいけません。(一種の双方向同期)

例を挙げましょう。(C1 .. Cn は、異なるコンピューターで実行されているプログラムです)

C1 は C2 に更新されたデータを送信します。処理がアクティブな間、C2 は C1 に何か他の更新を要求してはなりません。

アイデアは次のとおりです。

  1. C1 が C2 にメッセージを送信します: PauseExecution()
  2. C1 は、処理するアイテムを C2 に送信します (C2 の一部のデータを更新します)。
  3. C1 がメッセージを C2 に送信します: ResumeExecution()。
  4. C2 が C1 にメッセージを送信します: PauseExecution()
  5. C2 は、処理するアイテムを C1 に送信します (C1 の一部のデータを更新します)。
  6. C2 はメッセージを C1 に送信します: ResumeExecution()。

しかし今、最大の問題が発生します。

C1 が一時停止のために C2 にメッセージを送信し、同時に C22 が一時停止のために C1 にメッセージを送信すると、両方がブロックされます。

セマフォを保持するための集中サーバー/共有メモリはありません。

n台のコンピューターがブロックされないように使用できる別のパターンはありますか?

したがって、この質問はアルゴリズムによる除外に関するものです。

または、この問題の別の回避策はありますか?

4

1 に答える 1

1

リクエストに返信メッセージを送信して、異なる時間間隔でリクエストを再実行してみませんか。

C1はC2にメッセージを送信します:PauseExecution()(応答:OKではありません)

C2はC1にメッセージを送信します:PauseExecution()(応答:OKではありません)

C1は応答メッセージを受信します(別のメッセージを送信する前にランダムな時間待機します)

C2は応答メッセージを受信します(別のメッセージを送信する前にランダムな時間待機します)

C1はC2にメッセージを送信します:PauseExecution()(応答:OK)

于 2013-01-11T10:25:19.357 に答える