我使用 libpcap 捕获数据包,一旦数据包可用,我需要将数据包放入 FIFO 队列。但是 FIFO 队列是由 2 个线程共享的,一个线程调用 pcap_next() 并将数据包放入 FIFO 队列。另一个线程从 fifo 队列中获取数据包。所以我必须将它与互斥锁相关联。如下所示:
u_char* pkt;
for(;;){
pkt = pcap_next();
lock(&mutex);
some_process(pkt);
insert(pkt, list);
unlock(&mutext);
}
pcap_next() 与数据包缓冲区有关,如果缓冲区中没有数据包,则阻塞 pcap_next()。如果有数据包,则每次调用 pcap_next() 都会返回 1 个数据包。
它只能为每个锁定-解锁操作对获取一个数据包,如果数据包到达不频繁,则可以。但是如果报文到达频繁,比如缓冲区中有很多待处理的报文,那么为一个报文做一个lock-unlock操作对有点耗费资源。
我希望的是:处理并插入数据包后,我立即可以检查数据包缓冲区中是否有可用的数据包。如果有,继续处理和插入。否则,解锁互斥锁并返回循环。
有解决方法吗?