我有一个带有 1 个生产者线程和 N 个消费者线程的程序。产品有N种类型,所以我设置了N个FIFO队列(产品应该按顺序交付给消费者)。如:FIFO_queue_t* fifo_queque[N]。
如果 FIFO 队列中没有产品,消费者线程将被阻塞/等待。所以对于消费者线程i
,他们这样做:
for(;;)
{
sem_wait(&sem[i]);
product = fetch_one_product(queue);
process(product);
}
对于生产者,它在将产品用于线程i
放入 FIFO queue时调用 sem_post(&semp[i]) i
。
在我看来,在这种情况下我必须使用 N 个信号量,如果 N 很大,则资源消耗很大。我的想法有什么遗漏吗?
更新:
The system is like a proxy, and my original design is like this:
我有一个监听端口的 tcp 服务器listen(listenfd, 20)
;
生产者是一个 libpcap 实例,它从该端口捕获 TCP 数据包,产品是捕获数据包(包括 IP/TCP 头);
对于每个 connfd=accept(listenfd)。我创建了一个负责这个 connfd 的线程。这些线程是消费者。
我创建了一个查找表,每个条目中的字段是:
1 source IP/PORT, source address of incoming TCP connection,
2 FIFO Queue pointer: the fifo queue of captured spacket
3 pthread id : the thread that is responsible for a tcp connection
当生产者线程获取数据包时,它会从数据包中解析源 IP/PORT,查找表,定位 FIFO 队列并将其放入 FIFO 队列。
当消费者线程收到通知其 FIFO 队列中有一些数据包时,它会从队列中获取数据包。特别是对于最初的 3-way 数据包:TCP SYN、SYN/ACK 和 ACK,它需要维护一些状态信息,如 MSS、SACK 等,并且还需要将这些数据包(包括 TCP/IP 头)作为UDP 有效载荷,并将 UDP 数据包发送到其他一些远程主机。