在Java中,我正在创建256个线程,这些线程使用网络套接字相互通信。 所有这256个线程并行运行。生成线程时,它会尝试连接到其相邻线程。邻居列表可以是任意的。在这种情况下,如何确保所有线程与其邻居建立连接
为了在两个线程之间形成连接,一个线程必须打开 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中使用阻塞连接和接受方法。我有一种感觉,这可以使用非阻塞方法完成,但想先了解其他想法。
仅供参考,我的算法非常适合网状拓扑(至少我认为它确实如此)。
答案 0 :(得分:1)
如果在您的情况下死锁意味着出现这种情况:
ti -> tj and tj -> ti
为什么不在条件中包括作为一种新方法以避免这种情况,另外一部分如下:
if edge.tid > my tid and edge is not already connected to my tie
对于第一种情况,如果ti - >; tj已经存在,那么你不接受建立tj - &gt; TI
if edge.tid < my tid and my tie is not already connected to edge
对于这种情况第二种情况,如果tj - >; ti已经存在,那么你没有建立ti - &gt; TJ