0

在 Java 中,我创建了 256 个线程,它们使用网络套接字相互通信。所有这 256 个线程并行运行。当一个线程被生成时,它会尝试连接到它的相邻线程。邻居列表可以是任意的。在这种情况下,如何确保所有线程都与其邻居建立连接

  1. 没有死锁
  2. 没有星型拓扑(中心节点)

为了在两个线程之间建立连接,一个线程必须打开一个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

对于这种情况第二种情况,如果 tj -> ti 已经存在,那么你不建立 ti -> tj

于 2013-03-19T09:13:46.070 回答