libpcap を使用してパケットをキャプチャします。パケットが利用可能になったらすぐに、パケットを FIFO キューに入れる必要があります。ただし、FIFO キューは 2 つのスレッドで共有され、1 つのスレッドが 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 パケットが返されます。
ロックとロック解除の操作ペアごとに 1 つのパケットしかフェッチできません。パケットの到着が頻繁でなければ問題ありません。しかし、バッファ内に多くの保留中のパケットがあるように、パケットの到着が頻繁にある場合、1 つのパケットに対してロックとロック解除の操作ペアを実行するのは少しリソースを消費します。
私が望んでいるのは、パケットを処理して挿入した後、すぐにパケット バッファに利用可能なパケットがあるかどうかを確認できることです。ある場合は、処理と挿入を続行します。それ以外の場合は、ミューテックスのロックを解除してループに戻ります。
これに対する回避策はありますか?