如何在收到2个数据包后唤醒线程

时间:2010-11-23 20:36:33

标签: c++ linux network-programming

我正在为我的项目使用libnetfilter_queue。可以通过“队列文件描述符”访问C app队列。我有5个队列和5个线程来处理它们。我想要实现的是当队列中正好有2个数据包时唤醒线程。我想出了使用select函数和int数组来表示每个队列中排队的数据包的数量。选择退出后用> 0代码我检查哪个队列已收到数据包并在数组中增加值,如果它大于2我唤醒一个线程。一切都会好的,但是选择表明队列有数据要读,直到我调用recv而我不能这样做,因为单独的线程应该处理这些数据包。任何人都知道如何解决这个问题?我知道我可以设置SO_RCVLOWAT,但它不能解决我的问题,因为我不知道那2个数据包的大小。

2 个答案:

答案 0 :(得分:3)

根据东武的建议,epoll是一个更好的选择,它的性能优于选择。 但是,除非有人阅读,否则大多数这些轮询功能都会指示存在事件(可用数据)。 如果可能,请使用以下模型: 使用epoll / select来监视传入数据唤醒工作线程。 让工作线程在实际工作之前决定如何处理数据(一个数据包,两个或更多)。

OR: 一个Reader thread-N Worker线程:将使用epoll等待并读取所有传入的数据并将其发布到相应的工作线程的队列中。 一旦数据包的数量达到阈值,就唤醒工作线程(使用信号量)。

答案 1 :(得分:1)

您正在寻找边缘触发事件通知 - 当可用数据量发生变化时发送的通知。使用EPOLLET标志时,epoll的工作方式与此类似,默认情况下会重新通知通知,以便您不断收到新数据包的通知。

请注意,如果多次数据包在两次epoll_wait呼叫之间到达,您将只收到一次通知。