我有一个正在从普通select()转换的项目,但是由于我运行的测试有1000多个连接,我决定将其改为epoll。
我有代码工作,但遇到了一个问题,我正在努力解决哪个是最好的解决方法。
系统有一个libcurl线程从外部源中提取数据,这个线程缓存在内存中,等待拉具连接并获取数据。
当源数据完成时一切都很好,但是当有人在我下载新数据时连接,并且他们足够快地赶上libcurl线程时,他们就会进入饥饿状态。
我的问题是如何在不设置epollut和epoll_不断告诉我缓冲区中有空间的情况下重新启动拉具。
我的选择是
epollut,将导致很多epoll_等待告诉我缓冲区是空的,直到有一些数据可用。
计时器,我如何决定延迟
有一个连接列表,当新数据进入时,从libcurl线程发送数据,这是我不想做的。
从libcurl线程到epoll循环的某种信号,如何?
还有其他想法吗
最佳答案
您可以使用eventfd()
文件描述符来允许下载线程在到达更多数据时唤醒epoling线程。
不过,还不清楚为什么不必在select()
实现中解决相同的问题。
关于linux - EPOLL和进入流的饥饿,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33268978/