c-如何在接收2个数据包后唤醒线程
作者:互联网
我正在为我的项目使用libnetfilter_queue.通过“队列文件描述符”可以从C应用程序队列访问.我有5个队列和5个线程来处理它们.我要实现的是在队列中恰好有2个数据包时唤醒线程.我想到了使用选择函数和整数数组的想法,该数组指示每个队列中有多少个数据包排队.选择后,使用>退出. 0代码我检查哪个队列已收到数据包并在数组中增加值,如果它大于2,则唤醒线程.一切都很好,但是select表示队列中有要读取的数据,直到我调用recv为止,但我不能这样做,因为单独的线程应该处理这些数据包.有人知道如何解决这个问题吗?我知道我可以设置SO_RCVLOWAT,但是它不能解决我的问题,因为我不知道那两个数据包的大小.
解决方法:
正如Tobu所建议的那样,epoll是更好的选择,并且其性能比select更好.
但是,除非有人阅读,否则大多数这些轮询功能都将指示存在事件(可用数据).
如果可能,请使用以下模型:
使用epoll / select监视传入的数据唤醒工作线程.
在实际完成工作之前,让工作线程决定如何处理数据(一个数据包,两个或更多个数据包).
要么:
一个Reader线程-N Worker线程:将使用epoll等待并读取所有传入的数据,并将其发布到相应的worker线程的队列中.
一旦数据包数量达到阈值,请唤醒工作线程(使用信号量).
标签:network-programming,linux,c-4 来源: https://codeday.me/bug/20191105/1996665.html