基本服务器占用大量CPU资源 - 如何缓解?

时间:2014-10-31 01:57:25

标签: c++ multithreading server

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

我最终得到了类似的架构:

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

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

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

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

所以这样,我可以随时发出信号让他们自杀,但我注意到的副作用是他们正在进行大量的处理。我想知道如果使用这个设置我做了一些愚蠢的事情导致冗余计算。我不需要将它作为超低延迟服务器AT ALL,所以通过类似的“正确”方式,在每个循环之间休眠10秒?

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

1 个答案:

答案 0 :(得分:1)

您可能需要在Linux上探索非阻塞IO或在Windows上探索IO完成端口。请参阅herehere

编程这些需要额外的努力,并且比编写简单的套接字服务器更难。但是,有些库将包装非阻塞IO(和IOCP),并提供一个简单的接口供您使用。一个例子是ASIO的提升。即使是Java和其他语言,还有许多其他库。