我正在用独立于系统的C语言在linux下使用Berkely套接字API设计多线程TCP服务器。服务器必须执行I/O多路复用,因为服务器是管理客户端的集中式控制器(它永远与服务器保持持久连接(除非运行客户端的机器出现故障等))。服务器需要处理至少500个客户端。我有一个16核的机器,我想要的是我产生16个线程(每个核一个)和一个主线程。主线程将listen()连接到这些连接,然后将队列列表中的每个连接分派给一个线程,该线程随后将调用accept(),然后使用select() sys调用来执行I/O多路复用。现在的问题是,我如何知道何时分派线程来调用accept()。我的意思是,我如何在主线程中发现在listen()处存在挂起的连接,以便我可以分配一个线程来处理该连接。非常感谢大家的帮助。谢谢。
发布于 2012-01-30 22:14:39
请注意,如果您的16个线程中的每个线程都要运行select (或轮询,或其他什么),那么它们都可以将服务器套接字添加到它们的select集中。
当服务器套接字有传入连接时,可能会唤醒多个服务器套接字,但只有一个会成功调用accept,因此它应该可以工作。
优点:易于编码。
缺点:
中可能会出现问题
发布于 2012-01-30 21:48:39
listen()函数调用准备一个套接字来接受传入的连接。然后在该套接字上使用select(),并获得一个新连接已到达的通知。然后在服务器套接字上调用accept,将返回一个新的套接字id。如果您愿意,可以将套接字id传递给线程。
我要做的是让单个线程接受连接和接收数据,然后将数据作为工作项分派到队列进行处理。
发布于 2012-01-30 21:53:23
epoll或aio/asio。我怀疑你之前的帖子没有得到回复,因为当你要求一个可伸缩的高性能解决方案时,你没有指定linux。不同操作系统上的异步解决方案都是通过大量的内核支持来实现的,linux aio、Windows IOCP等都是不同的,以至于“系统独立”并不真正适用--没有人能给你一个答案。
现在,您已经将操作系统的范围缩小到linux,请查找适当的异步解决方案。
https://stackoverflow.com/questions/9064735
复制相似问题