我为我的项目使用libnetfilter_queue。 从C应用程序队列可以通过“队列文件描述符”访问。 我有5个队列和5个线程来处理它们。 我想要实现的是在队列中只有2个包时唤醒线程。 我想出了使用select函数和ints数组的方法,指出每个队列中有多less个数据包在排队。 select> 0代码退出后,我检查哪个队列已经收到一个数据包,并在数组中增加值,如果它大于2,我会唤醒一个线程。 一切都会好的,但select表明队列有数据读取,直到我呼吁recv,我不能这样做,因为单独的线程应该处理这些数据包。 任何人有想法如何解决这个问题? 我知道我可以设置SO_RCVLOWAT,但它不能解决我的问题,因为我不知道这两个数据包的大小是多less。
哪个模块叫我的DLL导出函数?
如何使用C在控制台上打印UTF-8字符
在Linux中使用GDAL API的程序
我可以使用全球系统钩子捕获哪个文件被点击?
如何在工作线程(非UI线程)中创buildmodal dialog?
根据Tobu的推荐,epoll是一个更好的选择,它的表现比选择更好。 但是,除非有人阅读,否则这些轮询功能中的大多数都会显示有事件(可用数据)。 如果可能,请使用以下模型:使用epoll / select来监视传入数据是否唤醒工作线程。 让工作者线程在实际工作之前决定如何处理数据(一个数据包,两个或更多)。
OR:一个Reader线程-N工作线程:将使用epoll等待并读取所有传入的数据,并将其发布到对应的工作线程的队列中。 一旦包数达到阈值,唤醒Worker线程(使用信号量)。
您正在寻找边缘触发的事件通知 – 在可用数据量发生变化时发送的通知。 当使用EPOLLET标志时, epoll的工作方式就像这样,默认情况下会重新设置通知,以便不断通知新的数据包。
请注意,如果在两个epoll_wait调用之间有几个数据包到达,您将只被通知一次。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。