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