我正在用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秒?
我刚开始编写网络代码,所以我很确定我只是在做一些愚蠢的事情。任何建议将不胜感激!