gpt4 book ai didi

c - 多线程服务器设计

转载 作者:太空宇宙 更新时间:2023-11-04 03:03:08 24 4
gpt4 key购买 nike

我正在尝试实现一个 TCP 服务器,它是一个更大项目的一部分。基本上,服务器应该能够与任意数量的客户端(最少 32 个)保持 TCP 连接,并为任何请求服务的客户端提供服务。在我们的场景中,假设一旦客户端连接到服务器,它将永远不会关闭连接,除非发生某种故障(例如运行客户端的机器发生故障)并且它将重复请求服务服务器。所有其他客户端也是如此,即每个客户端都将保持与服务器的连接并执行事务。所以总而言之,服务器将同时维护与客户端的连接,同时根据需要为每个客户端提供服务,并且还应该能够接受任何其他想要连接到服务器的客户端连接。

现在,我使用 berkely 套接字 API 的 select() 系统调用实现了上述功能,当我们有少量客户端(比如 10 个)时,它工作正常。但是服务器需要扩展到尽可能高的级别,因为我们在 16 核机器上实现它。为此,我研究了各种多线程设计技术,例如每个客户端一个线程等,我认为最好的技术是线程池设计。现在,当我即将实现时,我遇到了一些问题:如果我指定主线程接受任意数量的传入连接并将每个连接文件描述符保存在数据结构中,并且我有一个线程池,我将如何让线程轮询特定客户端是否正在请求服务或不是。对于客户端联系服务器并在获取服务后关闭连接的场景,设计足够简单,这样我们就可以从池中选择一个线程,为客户端提供服务,然后将其推回池中以供将来的连接处理。但是,当我们必须为一组保持连接并间歇性请求服务的客户端提供服务时,执行此操作的最佳方法是什么。非常感谢所有帮助,因为我真的深陷其中。谢谢。

最佳答案

使用 pthreads,每个 CPU 一个线程外加一个额外线程。

额外线程(主线程)通过listen()系统调用监听新连接,通过accept()接受新连接,然后判断哪个工作线程当前连接数最少,获取锁/互斥量对于该工作线程的“挂起连接”FIFO 队列,将已接受连接的描述符放入工作线程的“挂起连接”FIFO 队列,并向工作线程发送“检查您的队列”通知(例如使用管道)。

工作线程使用“select()”,并向它们接受的任何连接发送/接收数据。如果/当工作线程从主线程收到“检查您的队列”通知时,它将为其“待处理连接”FIFO 队列获取锁/互斥锁,并将任何新接受的连接添加到其“fd_set”列表。

对于 1024 个连接和 16 个 CPU;您最终可能会得到一个主线程等待新连接(但几乎什么都不做,因为您不会期望有很多新连接),而 16 个工作线程平均每个线程处理 64 个连接。

关于c - 多线程服务器设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9056614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com