首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在多线程TCP服务器中使用Listen() sys调用

在多线程TCP服务器中使用Listen() sys调用
EN

Stack Overflow用户
提问于 2012-01-30 21:38:16
回答 3查看 1.3K关注 0票数 1

我正在用独立于系统的C语言在linux下使用Berkely套接字API设计多线程TCP服务器。服务器必须执行I/O多路复用,因为服务器是管理客户端的集中式控制器(它永远与服务器保持持久连接(除非运行客户端的机器出现故障等))。服务器需要处理至少500个客户端。我有一个16核的机器,我想要的是我产生16个线程(每个核一个)和一个主线程。主线程将listen()连接到这些连接,然后将队列列表中的每个连接分派给一个线程,该线程随后将调用accept(),然后使用select() sys调用来执行I/O多路复用。现在的问题是,我如何知道何时分派线程来调用accept()。我的意思是,我如何在主线程中发现在listen()处存在挂起的连接,以便我可以分配一个线程来处理该连接。非常感谢大家的帮助。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-30 22:14:39

请注意,如果您的16个线程中的每个线程都要运行select (或轮询,或其他什么),那么它们都可以将服务器套接字添加到它们的select集中。

当服务器套接字有传入连接时,可能会唤醒多个服务器套接字,但只有一个会成功调用accept,因此它应该可以工作。

优点:易于编码。

缺点:

  • 朴素的实现不会平衡负载(例如。有关每个线程处理的已接受套接字数量的全局统计信息,高负载线程将服务器套接字从其select sets)
  • thundering群组行为中删除时,在高接受率

中可能会出现问题

票数 1
EN

Stack Overflow用户

发布于 2012-01-30 21:48:39

listen()函数调用准备一个套接字来接受传入的连接。然后在该套接字上使用select(),并获得一个新连接已到达的通知。然后在服务器套接字上调用accept,将返回一个新的套接字id。如果您愿意,可以将套接字id传递给线程。

我要做的是让单个线程接受连接和接收数据,然后将数据作为工作项分派到队列进行处理。

票数 2
EN

Stack Overflow用户

发布于 2012-01-30 21:53:23

epoll或aio/asio。我怀疑你之前的帖子没有得到回复,因为当你要求一个可伸缩的高性能解决方案时,你没有指定linux。不同操作系统上的异步解决方案都是通过大量的内核支持来实现的,linux aio、Windows IOCP等都是不同的,以至于“系统独立”并不真正适用--没有人能给你一个答案。

现在,您已经将操作系统的范围缩小到linux,请查找适当的异步解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9064735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档