Javaでは、ネットワークソケットを使用して相互に通信する256のスレッドを作成しています。この256個のスレッドはすべて並行して実行されます。スレッドが生成されると、隣接するスレッドに接続しようとします。ネイバーのリストは任意にすることができます。この状況で、すべてのスレッドが隣接するスレッドとの接続を作成することを確認する方法
- デッドロックなし
- スタートポロジなし(中央ノード)
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のブロッキング接続メソッドと受け入れメソッドを使用しています。これは非ブロッキング方式を使用して実行できると思いますが、最初に他のアイデアを知りたいと思います。
参考までに、私のアルゴリズムはメッシュトポロジで完全に機能します(少なくとも機能すると思います)。