适合bittorrent客户端的多线程模型?

时间:2012-07-22 11:26:06

标签: c++ multithreading bittorrent

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

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

该计划将与众多同行定期联系,以便从他们那里下载文件。以下摘自Bittorrent Specification Wiki

实施者注:即使有30个对等体也很多,官方客户端版本3实际上只有少于30个对等体才会主动形成新连接,如果有55个,则拒绝连接。这个值对性能很重要。当新片段完成下载时,需要将HAVE消息(见下文)发送给大多数活跃的对等体。结果,广播流量的成本与对等体的数量成正比。超过25岁,新同行极不可能提高下载速度。强烈建议UI设计师使其变得模糊,难以改变,因为这样做很少有用。

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

您可能希望将校验和检查卸载到单独的线程。不太确定这有多复杂,但是如果涉及到大量的CPU使用,那么将它放在I / O的东西上并不是那么糟糕。

答案 1 :(得分:1)

当你标记你的问题[C ++]时,我建议使用C ++ 11的std:thread。一个很好的教程(很多其他的)你找到here

关于线程的数量:你可以毫无问题地使用30个线程,并让它们检查是否有什么事要做,让它们在检查之间的合理时间内进入休眠状态。操作系统将负责其余的工作。