在 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 中使用阻塞连接和接受方法。我觉得这可以使用非阻塞方法来完成,但想先了解其他想法。
仅供参考,我的算法非常适用于网状拓扑(至少我认为可以)。