0

Javaでは、ネットワークソケットを使用して相互に通信する256のスレッドを作成しています。この256個のスレッドはすべて並行して実行されます。スレッドが生成されると、隣接するスレッドに接続しようとします。ネイバーのリストは任意にすることができます。この状況で、すべてのスレッドが隣接するスレッドとの接続を作成することを確認する方法

  1. デッドロックなし
  2. スタートポロジなし(中央ノード)

2つのスレッド間の接続を形成するには、1つのスレッドがServerSocketを開き、他のスレッドがそれに参加する必要があります。現在、私は単純なアルゴリズムを使用しています:

for all edges
do
   if edge.tid > my tid
   then
      connect to edge.ip
   endif   
done

for all edges
do
   if edge.tid < my tid
   then
       accept connection from edge.ip
   endif
done

上記のように、私は最初に大きな隣人に接続し、次に小さな隣人が私に接続するのを待っています。これにより、ネイバーフッドテーブルが次のようになっているときにデッドロックが発生する可能性があります。

t0 -> t3, t1 
t1 -> t2, t0
t2 -> t1
t3 -> t0

デッドロックのない特定のアルゴリズムはありますか?私のアルゴリズムは、Javaのブロッキング接続メソッドと受け入れメソッドを使用しています。これは非ブロッキング方式を使用して実行できると思いますが、最初に他のアイデアを知りたいと思います。

参考までに、私のアルゴリズムはメッシュトポロジで完全に機能します(少なくとも機能すると思います)。

4

1 に答える 1

1

あなたの場合、デッドロックがこの状況を意味する場合:

ti -> tj and tj -> ti

この状況を回避するための新しいアプローチとして、次のような追加部分を条件に含めてみませんか。

if edge.tid > my tid and edge is not already connected to my tie

最初のケースでは、ti -> tj が既に存在する場合、tj -> ti の確立を受け入れません。

if edge.tid < my tid and my tie is not already connected to edge

この場合 2 番目のケースでは、tj -> ti が既に存在する場合、ti -> tj を確立しません。

于 2013-03-19T09:13:46.070 に答える