2

我目前正在编写一个 bittorrent 客户端。我正在进入我的程序阶段,我需要开始考虑多个线程是否会改进我的程序以及我需要多少线程。

我假设我会分配一个线程来处理跟踪器,因为程序可能一次与其中几个(大约 1-5 个)联系,但只需要在跟踪器分配的时间间隔内联系它们(大约 20分钟),因此不会对程序非常密集。

该程序将定期与众多同行联系,以从他们那里下载文件。以下内容来自Bittorrent 规范 Wiki

实现者注意:即使30个peer也足够了,官方客户端版本3实际上只有在peer少于30个时才主动建立新连接,如果达到55个则拒绝连接。这个值对性能很重要。当一个新片段完成下载时,需要将 HAVE 消息(见下文)发送给大多数活跃的对等点。结果,广播流量的成本与对等点的数量成正比增长。超过 25 岁的新同行极不可能提高下载速度。强烈建议 UI 设计人员将其变得晦涩难懂且难以更改,因为这样做非常有用。

这表明我应该与大约 30 个同行联系。什么是用于我的 Bittorrent 客户端的好的线程模型?显然我不想为每个对等点和每个跟踪器分配一个线程,但我可能需要的不仅仅是主线程。你有什么建议?

4

2 回答 2

3

我认为这里不需要多线程。线程过多也意味着在这些线程之间进行大量通信,以确保每个人都在正确的时间做正确的事情。

对于网络,将所有内容保持在一个线程上,并使用非阻塞 I/O 进行多路复用。在 Unix 系统上,这将是一个带有 select/poll(或特定于平台的扩展,例如 epoll)的设置;在 Windows 上,这将是完成端口。

您甚至可以将磁盘 I/O 添加到其中,这将使线程之间的通信变得微不足道,因为没有任何 :-)

如果您想将线程视为单独组件的容器,则磁盘 I/O 可以进入另一个线程。在这种情况下,您可以使用阻塞 I/O,因为无论如何都没有很多多路复用。

同样,在这种情况下,跟踪器处理也可能进入不同的线程,因为它是与对等处理不同的组件。DHT 也是如此。

您可能希望将校验和检查卸载到单独的线程。不太确定这会变得多么复杂,但如果涉及大量 CPU 使用,那么将其从 I/O 东西中移除听起来并没有那么糟糕。

于 2012-07-22T12:08:36.770 回答
1

当您标记您的问题 [C++] 时,我建议std:thread of C++11 。您可以在此处找到一个不错的教程(以及许多其他教程)。

关于线程数:您可以毫无问题地使用 30 个线程,并让它们检查是否有事情要做,并在检查之间让它们休眠一段合理的时间。操作系统将负责其余的工作。

于 2012-07-22T11:39:05.757 回答