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



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

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

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

关键是线程总数(首先在你的进程中:polling+worker…)而且在整个系统中)必须保持恒定且不超过处理资源(cpu/内核)的数量

轮询线程和工作线程之间的这种区别是正确的。使用队列结构解耦,将轮询线程从工作线程上运行的(任意)逻辑中解放出来,不受阻碍地完成它们的工作(即轮询)。

在Windows上,IOCP是可扩展异步IO的标准模型。它解决了你提到的所有问题。它有一个合理的编程模型(有一些API设计错误)。我相信有独立的样品。为了学习IOCP,我将使用这项技术创建一个非常简单的聊天服务器,并尝试让它绝对正确。

select的缺点是不能伸缩(如您所说)。

如果你想要可移植性,看看像Boost asio这样的异步IO库。它们在所有现代平台上使用类似iocp的模型。

最新更新