我有一个生产者多消费者程序,每个角色都有线程。我正在考虑在每个消费者上为 tcp 实现一个循环缓冲区,并允许生产者保留指向循环缓冲区内存的指针,然后将指针空间分发给 tcp 以将数据卸载到其中。
我的问题,如何让消费者线程知道数据何时进入?
我正在考虑忙于检查指针位置是否为 0;我不介意成为cpu猪。
我应该提一下每个线程都是 SCHED_FIFO 的 cpuset 和 soft RT,当然还有 c 实现的。
我有一个生产者多消费者程序,每个角色都有线程。我正在考虑在每个消费者上为 tcp 实现一个循环缓冲区,并允许生产者保留指向循环缓冲区内存的指针,然后将指针空间分发给 tcp 以将数据卸载到其中。
我的问题,如何让消费者线程知道数据何时进入?
我正在考虑忙于检查指针位置是否为 0;我不介意成为cpu猪。
我应该提一下每个线程都是 SCHED_FIFO 的 cpuset 和 soft RT,当然还有 c 实现的。
根据我的经验,多个消费者数据结构的问题是要正确处理并发,同时避免错误共享或过度浪费 CPU 周期的问题。
因此,如果您的问题允许,我会使用pipe
为每个消费者创建一个管道,并以循环方式将项目放入这些管道中。然后,消费者可以使用epoll
来查看文件句柄。这避免了必须实现和优化并发数据结构,并且您不会不必要地消耗 CPU 周期。代价是你必须通过系统调用。
如果您想通过轮询自己完成所有操作以避免系统调用,您可以构建一个循环缓冲区,但您必须确保只有一个进程同时读取一个项目,并且只有在项目被写入之后。通常这是用 4 个指针和适当的互斥锁来完成的。
这篇关于Xen 的 I/O 环形缓冲区的文章可能很有趣。