Linux EPOLL和传入流的饥饿

Linux EPOLL和传入流的饥饿,linux,curl,pthreads,epoll,Linux,Curl,Pthreads,Epoll,我有一个从普通select()转换过来的项目,但由于我运行了一个测试,它有1000多个连接,我决定将它改为epoll 我有工作的代码,但遇到了一个问题,我正试图找出这是最好的方式来解决 系统有一个从外部源提取数据的libcurl线程,该线程缓存在内存中,等待拉取器连接并获取数据 当源数据完成时一切都很好,但是当有人在我下载新数据时连接,并且他们的速度足以赶上libcurl线程时,他们就会陷入饥饿状态 我的问题是,如何在不设置EPOLLOUT和让epoll_不断等待并告诉我缓冲区中有空间的情况下重

我有一个从普通select()转换过来的项目,但由于我运行了一个测试,它有1000多个连接,我决定将它改为epoll

我有工作的代码,但遇到了一个问题,我正试图找出这是最好的方式来解决

系统有一个从外部源提取数据的libcurl线程,该线程缓存在内存中,等待拉取器连接并获取数据

当源数据完成时一切都很好,但是当有人在我下载新数据时连接,并且他们的速度足以赶上libcurl线程时,他们就会陷入饥饿状态

我的问题是,如何在不设置EPOLLOUT和让epoll_不断等待并告诉我缓冲区中有空间的情况下重新启动拉具

我的选择是

  • EPOLLOUT将导致大量epoll_等待,直到有一些数据可用时才告诉我缓冲区为空

  • 计时器,我如何决定延迟

  • 有一个连接列表,当新数据进来时,从libcurl线程发送数据,这是我不想做的

  • 从libcurl线程到epoll循环的某种信号,如何发送


  • 任何其他想法

    您可以使用
    eventfd()
    文件描述符,允许下载线程在更多数据到达时唤醒epolling线程


    但是,不清楚为什么您不必在
    select()
    实现中解决相同的问题。

    2048 max sockets而不必胡闹。阅读一些关于epoll的文章会更好地扩展。这里hoping@JulianGardner:当然,我理解为什么您会选择使用
    epoll()
    而不是
    select()
    ,但我想问的是,为什么您在
    select()中的上载线程与下载线程之间没有相同的问题
    implementation?我确实这样做了,但我在select上使用了一个小的超时来克服这个问题,如果我一直保持EPOLOUT设置,就会发生同样的情况。Ok代码更新了,我知道有两个列表,一个用于已暂停的套接字,另一个用于已均匀写入的套接字。在curl-thread循环中,我遍历这个列表,使用eventfd_write发布并将其移动到第二个列表:在主eventfd循环中,我根据这个列表检查套接字编号,如果设置了,则进入发送代码。