C++ 多个或仅一个接受连接的线程?

C++ 多个或仅一个接受连接的线程?,c++,multithreading,sockets,winsock,C++,Multithreading,Sockets,Winsock,我需要一些关于如何接受连接的指导。我有一个带有线程池的服务器(例如30个线程) 现在我不知道我是否应该利用这些现有线程来接受连接,或者我是否应该创建一个单独的线程来处理这个问题 B不确定此方法,因为程序无法在接受/单个线程运行其任务之前接受连接 A。这感觉好多了。使用AcceptEx并使多个线程在GetQueuedCompletionStatus中等待。然后,接收包的第一个线程可以再次调用AcceptEx() 假设服务器有1000个连接等待接受。哪种方法最有效、最快 致意 Arre重叠I/O(不

我需要一些关于如何接受连接的指导。我有一个带有线程池的服务器(例如30个线程)

现在我不知道我是否应该利用这些现有线程来接受连接,或者我是否应该创建一个单独的线程来处理这个问题

B不确定此方法,因为程序无法在接受/单个线程运行其任务之前接受连接

A。这感觉好多了。使用AcceptEx并使多个线程在GetQueuedCompletionStatus中等待。然后,接收包的第一个线程可以再次调用AcceptEx()

假设服务器有1000个连接等待接受。哪种方法最有效、最快

致意
Arre

重叠I/O(不仅用于接受,也用于读/写)通常被认为是在Windows上以可伸缩方式处理高流量负载的最佳方式。实际上,在Windows 8+上的性能甚至更高,但它太新了,还不能广泛使用。通常情况下,您会有一个单线程来执行accept和setup max allowed connections(在单线程上实现这一点要容易得多)。当您有1000个挂起的连接时,这种情况是病态的,永远不会发生。多线程执行accept可能会表现得更好,但我怀疑差异是否明显。如果这些线程应该做其他事情,比如处理接受的连接,那么它的性能可能会更差(或者更确切地说是扩展)。无论如何,我不认为接受永远是一个瓶颈。而且单线程接受更容易实现、维护和控制。@freakish“如果这些线程应该做其他事情,比如处理接受的连接,它的性能可能会更差(或者更确切地说是扩展)。-我也考虑过这一点,然后我想如果我用完了“处理线程”那么,客户是否被接受并不重要。请求仍将延迟。@很好,客户端无法区分“服务器正忙,当前无法接受”和“服务器已关闭”或“根本没有服务器(例如,tcp目标不正确)”。我认为UX最好总是接受并延迟流媒体。“这样至少你知道你已经联系上了。”奇怪的好想法。我将允许线程池接受连接,但我也将有一个线程(“接待员”),它除了等待传入的客户端接受外,不做任何其他事情。然后,其他线程可以在可用时作为备份存在。也许有些过分,但我不必再担心这个问题了。通常,重叠I/O(不仅用于接受,也用于读/写)是在Windows上以可伸缩方式处理高流量负载的最佳方式。实际上,在Windows 8+上的性能甚至更高,但它太新了,还不能广泛使用。通常情况下,您会有一个单线程来执行accept和setup max allowed connections(在单线程上实现这一点要容易得多)。当您有1000个挂起的连接时,这种情况是病态的,永远不会发生。多线程执行accept可能会表现得更好,但我怀疑差异是否明显。如果这些线程应该做其他事情,比如处理接受的连接,那么它的性能可能会更差(或者更确切地说是扩展)。无论如何,我不认为接受永远是一个瓶颈。而且单线程接受更容易实现、维护和控制。@freakish“如果这些线程应该做其他事情,比如处理接受的连接,它的性能可能会更差(或者更确切地说是扩展)。-我也考虑过这一点,然后我想如果我用完了“处理线程”那么,客户是否被接受并不重要。请求仍将延迟。@很好,客户端无法区分“服务器正忙,当前无法接受”和“服务器已关闭”或“根本没有服务器(例如,tcp目标不正确)”。我认为UX最好总是接受并延迟流媒体。“这样至少你知道你已经联系上了。”奇怪的好想法。我将允许线程池接受连接,但我也将有一个线程(“接待员”),它除了等待传入的客户端接受外,不做任何其他事情。然后,其他线程可以在可用时作为备份存在。也许是杀伤力太大了,但我再也不用担心这个了