减轻轮询环缓冲区的影响

时间:2012-06-11 18:11:12

标签: c multithreading producer-consumer

我有一个生产者多个消费者程序,每个角色都有线程。我正在考虑在每个使用者上为tcp实现一个循环缓冲区,并允许生产者保持指向循环缓冲区内存的指针,然后将指针空间分配给tcp以将数据卸载到。

我的问题是,如何让消费者线程知道数据何时进入?

我正在考虑忙于等待检查指针位置而不是0;我不介意做个cpu猪。

我应该提到每个线程都是SCHED_FIFO的cpuset和soft RT,当然还有c实现。

1 个答案:

答案 0 :(得分:1)

根据我的经验,多个消费者数据结构的问题是正确处理并发性,同时避免错误共享或过度浪费CPU周期的问题。

因此,如果您的问题允许,我会使用pipe为每个消费者创建一个管道,并以循环方式将项目放入这些管道中。然后,消费者可以使用epoll来查看文件句柄。这避免了必须实现和优化并发数据结构,并且不会不必要地刻录CPU周期。成本是您必须通过系统调用。

如果你想通过轮询自己做所有事情以避免系统调用,你可以构建一个循环缓冲区,但你必须确保只有一个进程同时读取一个项目,并且只有在项目写入​​之后。通常用4个指针和适当的互斥量来完成。

关于Xen's I/O ringbuffers的这篇文章可能会引起关注。