我正在用 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 完成端口。参见 here和 here .
对这些进行编程需要付出额外的努力,并且比对简单的套接字服务器进行编程要难一些。但是,有些库将包装非阻塞 IO(和 IOCP)并提供一个简单的接口(interface)供您使用。一个例子是 ASIO in boost。还有许多其他库,甚至用于 Java 和其他语言。
关于c++ - 基础服务器占用大量CPU资源——如何缓解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26666413/