非阻塞套接字多线程接收模型

时间:2014-06-06 10:43:48

标签: c++ multithreading sockets c++11

我正在研究用于学习目的的多线程服务器应用程序。我现在的问题是接收数据。我第一次编写应用程序时使用的是WSAAsyncSelect,但我不知道它是如何工作的(我认为窗口依赖是愚蠢的,即使你隐藏了窗口。) 。所以我重写了它,现在我有一个线程通过连接的客户端并检查是否有任何数据要接收并将其传递给工作线程。这适用于少数客户,但我认为,对于更大的数量,它可能会延迟其他客户太多。我读过的解决方案是为每个客户端提供一个线程,但存在线程限制。另一个解决方案是IOCP(Windows),但我需要找到一个好的文档,因为我发现的例子有点过于模糊(我可能会遇到这个问题)

我在Microsoft Visual Studio 2013下使用C / C ++的语言(WinSock,但我想以多平台方式编写)

2 个答案:

答案 0 :(得分:0)

如果一个线程足以处理所有客户端,请考虑在可用线程中使用N个线程并分发客户端(例如通过散列或接收顺序)。

关键是线程的总数(进程中的第一个:轮询+工作者......以及整个系统中)必须保持不变并且不超过处理资源(CPU /核心)的数量

轮询线程和工作线程之间的区别是正确的方法。使用队列结构解耦,释放轮询线程,以便在工作线程上运行的(任意)逻辑上不受阻碍地完成工作(即轮询)。

答案 1 :(得分:0)

在Windows上,IOCP是可扩展异步IO的标准模型。它解决了你提到的所有问题。 It has a sane programming model (with a few API design errors). I believe there are self-contained samples.要了解IOCP,我会使用这项技术创建一个非常简单的聊天服务器,并尝试将其完全正确。

选择的缺点是它不能缩放(如你所说)。

如果您想要可移植性,请查看像Boost asio这样的异步IO库。他们在所有现代平台上使用类似IOCP的模型。它们是回调驱动的。