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

标签 c++ multithreading sockets c++11

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

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

最佳答案

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

关键是总线程数(首先在你的进程中:polling+worker...还有整个系统)必须保持不变,不能超过处理资源(CPUs/cores)的数量

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

关于c++ - 非阻塞套接字多线程接收模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24079915/

相关文章:

c++ - GCC Eclipse 中的“ undefined reference ”错误

java - 在Java中,有没有办法检查Runnable是否在单线程中完成?

mysql - 如何找到Mysql线程

聊天中的 Python 客户端

c++ - 我可以从运行时加载的共享对象访问主机进程的符号吗?还有其他选择吗?

c++ - 编译器如何优化这段代码

c++ - Linux套接字程序只是卡住而没有错误

c++ - 如何使 libpcap/pcap_loop 成为非阻塞的?

c++ - Boost asio 异步读写

file - 编程中流的底层原理是什么?