监听多个套接字:选择与多线程
Posted
技术标签:
【中文标题】监听多个套接字:选择与多线程【英文标题】:Listening to multiple sockets: select vs. multi-threading 【发布时间】:2012-01-27 21:19:25 【问题描述】:服务器需要监听来自多个套接字 (10-20) 的传入数据。在一些初始化之后,这些套接字被创建并且不会改变(即不接受新的套接字,并且在服务器的生命周期内它们都不会关闭)。
一种选择是在所有套接字上select()
,然后处理每个套接字的传入数据(即路由到适当的处理函数)。
另一种选择是为每个套接字打开一个线程,让每个线程recv()
处理输入。
(第一个选项有设置超时的好处,但在这种情况下这不是问题, 因为所有的套接字都非常活跃)。
假设以下情况:Windows 服务器有足够的内存,20MB(对于 20 个线程)不是问题,这些选项中的任何一个是否会比另一个更快?
【问题讨论】:
我认为对于 10-20 个套接字,为每个套接字分配一个线程不是问题,并且使用“recv()”进行处理通常会更快编程(afaik)。另请参阅此讨论以获取更多意见:gamedev.net/topic/304030-async-sockets-or-select-with-threads 【参考方案1】:在您的应用中没有太多内容。通常,使用每套接字线程比异步方法更容易,因为它的整体结构更简单,更容易维护状态。
【讨论】:
此外,网络速度不受此选择的影响。这是一个关于 CPU 和内存效率的选择。以上是关于监听多个套接字:选择与多线程的主要内容,如果未能解决你的问题,请参考以下文章