c++ - 基础服务器占用大量CPU资源——如何缓解?

标签 c++ multithreading server

我正在用 C++ 编写一个非常基本的服务器。

我最终得到了一个类似于这样的架构:

一个线程(服务器)不断循环 accept() 等待连接 (docs)

它找到的每个连接都会生成一个循环遍历 recv() 等待读取内容的线程,以及发送队列 (recv docs) 中的任何内容的 send() , (send docs)

但是,我希望能够(从外部线程)告诉服务器或单个连接从本质上杀死它们自己。问题是 accept()recv() 都会阻塞,直到它们发现任何事件,所以它们无法检查它们的 should_kill_self 成员已设置或任何内容。因此,为了解决这个问题,我在文件描述符上调用了 fcntl(sock_fd, F_SETFL, O_NONBLOCK),这样它们就不会了。

这样,我让服务器不断循环 accept() 并检查 should_kill_self,并且我让每个连接循环 recv(),检查队列中是否有任何东西要 send(),并检查 should_kill_self

因此,通过这种方式,我可以随时向他们发出自杀信号,但我注意到的一个副作用是他们占用了大量的处理时间。我想知道是否使用此设置我在做一些愚蠢的事情导致冗余计算。我根本不需要它成为一个超低延迟的服务器,那么通过在每个循环之间休眠 10 秒来缓解这种情况的“正确”方法是不是?

我是编写网络代码的新手,所以我很确定我只是在做一些愚蠢的事情。任何建议将不胜感激!

最佳答案

您可能需要探索 Linux 中的非阻塞 IO 或 Windows 上的 IO 完成端口。参见 herehere .

对这些进行编程需要付出额外的努力,并且比对简单的套接字服务器进行编程要难一些。但是,有些库将包装非阻塞 IO(和 IOCP)并提供一个简单的接口(interface)供您使用。一个例子是 ASIO in boost。还有许多其他库,甚至用于 Java 和其他语言。

关于c++ - 基础服务器占用大量CPU资源——如何缓解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26666413/

相关文章:

c++ - 为什么 pthread_attr_setstacksize() 对我不起作用?

eclipse - org.apache.catalina.core.ContainerBase startInternal 严重 : A child container failed during start: java. util.concurrent.ExecutionException

c++ - Win32 对话框上的 WM_CLOSE 和 IDCANCEL

java - 使用 JNA 访问包含 vector<char*> 的结构

c# - 后台运行方法和UI Thread WPF

java - 类型参数导致错误

java - 服务器没有收到客户端的请求

java - 在 tomcat 上运行简单的 hello restapi 时出现 404 响应

c++ - 使用 new 分配 4k 整数后内存覆盖

c++ - 如何将应用于所有顶点的顶点着色器动态数据传递?