非阻塞套接字多线程接收模型
Non-blocking sockets multi-threaded receive model
我正在开发一个用于学习的多线程服务器应用程序。我现在的问题是接收数据。我第一次编写应用程序时使用了WSAAsyncSelect,但我不喜欢它的工作方式(在我看来,窗口依赖是愚蠢的,即使你隐藏了窗口)。所以我重写了它,现在我有一个线程,它会通过连接的客户端,检查是否有任何要接收的数据,并将其传递给工作线程。这只适用于一小部分客户端,但我认为对于较大数量的客户端,它可能会过多地延迟其他客户端。我读过的一种解决方案是为每个客户端提供一个线程,但存在线程限制。另一个解决方案是IOCP (Windows),但我需要找到一个好的文档,因为我发现的例子有点模棱两可(我可能是这里的问题)
我在Microsoft Visual Studio 2013下使用的语言是C/c++ (WinSock,但我想以多平台的方式编写)
如果一个线程足以处理所有客户端,请考虑使用N个线程并在可用线程中分配客户端(例如通过散列或按接收顺序)。
关键是线程总数(首先在你的进程中:polling+worker…)而且在整个系统中)必须保持恒定且不超过处理资源(cpu/内核)的数量
轮询线程和工作线程之间的这种区别是正确的。使用队列结构解耦,将轮询线程从工作线程上运行的(任意)逻辑中解放出来,不受阻碍地完成它们的工作(即轮询)。
在Windows上,IOCP是可扩展异步IO的标准模型。它解决了你提到的所有问题。它有一个合理的编程模型(有一些API设计错误)。我相信有独立的样品。为了学习IOCP,我将使用这项技术创建一个非常简单的聊天服务器,并尝试让它绝对正确。
select的缺点是不能伸缩(如您所说)。
如果你想要可移植性,看看像Boost asio这样的异步IO库。它们在所有现代平台上使用类似iocp的模型。
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 在C 中,发送者接收器模型中的多线程
- 适用于bittorrent客户端的良好多线程模型
- 具有强内存模型的平台上的易失性和多线程
- 并发:用于多线程环境中共享变量的C++11内存模型
- 非阻塞套接字多线程接收模型
- 多线程/分叉服务器守护进程的模型