适用于bittorrent客户端的良好多线程模型
Good Multi-Thread Model for a bittorrent client?
我目前正在编写一个bittorrent客户端。在我的程序中,我需要开始思考多个线程是否会改进我的程序,以及我需要多少线程。
我假设我会分配一个线程来处理跟踪器,因为程序可能会同时与几个(大约1-5个)跟踪器接触,但只需要在跟踪器指定的时间间隔内(大约20分钟)与它们接触,所以程序不会很密集。
该程序将定期与众多同行联系,从他们那里下载文件。以下内容摘自Bittorrent规范Wiki:
实施者的注意:即使有30个对等点也足够了,事实上,官方客户端版本3只有在对等点少于30个的情况下才会主动形成新连接,如果对等点少于55个,则会拒绝连接。此值对性能非常重要。当一篇新文章完成下载后,需要将HAVE消息(见下文)发送给大多数活跃的对等方。因此,广播流量的成本与对等体的数量成正比地增长。在25岁以上,新的同行极不可能提高下载速度。强烈建议UI设计者将其弄得晦涩难懂,因为这样做很少有用。
这表明我应该与大约30名同龄人接触。对于我的Bittorrent客户端来说,什么是好的线程模型?显然,我不想为每个对等端和每个跟踪器分配一个线程,但我可能需要的不仅仅是主线程。你有什么建议?
我认为这里没有太多的多线程需求。有太多的线程也意味着这些线程之间要进行大量的通信,以确保每个人都在正确的时间做正确的事情。
对于网络,将所有内容保持在一个线程上,并使用非阻塞I/O进行多路复用。在Unix系统上,这将是一个带有选择/轮询(或特定于平台的扩展,如epoll)的设置;在Windows上,这将是完成端口。
您甚至可以将磁盘I/O添加到其中,这将使线程之间的通信变得微不足道,因为没有任何:-)
如果您想将线程视为单独组件的容器,那么磁盘I/O可以进入另一个线程。在这种情况下,您可以使用阻塞I/O,因为无论如何都没有太多多路复用。
同样,在这种情况下,跟踪器处理也可以进入不同的线程,因为它与对等处理是不同的组件。DHT也是如此。
您可能希望将校验和检查卸载到一个单独的线程。不太确定这会有多复杂,但如果涉及大量CPU使用,那么将其从I/O中删除听起来也没那么糟糕。
当您标记问题[C++]时,我建议使用C++11的std:thread。你可以在这里找到一个很好的教程(还有很多其他教程)。
关于线程数量:您可以毫无问题地使用30个线程,并让它们检查是否有什么事情要做,并在检查之间让它们休眠一段合理的时间。操作系统将处理其余部分。
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 在C 中,发送者接收器模型中的多线程
- 适用于bittorrent客户端的良好多线程模型
- 具有强内存模型的平台上的易失性和多线程
- 并发:用于多线程环境中共享变量的C++11内存模型
- 非阻塞套接字多线程接收模型
- 多线程/分叉服务器守护进程的模型