c - 减轻轮询环形缓冲区的影响

标签 c multithreading producer-consumer

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

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

我正在考虑忙等待检查指针位置是否有除 0 之外的其他内容;我不介意成为一个 cpu 霸主。

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

最佳答案

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

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

如果您想通过轮询自己完成所有操作以避免系统调用,您可以构建一个循环缓冲区,但您必须确保只有一个进程同时读取一项,并且仅在该项写入后读取。通常这是通过 4 个指针和适当的互斥体来完成的。

这篇文章关于Xen's I/O ringbuffers可能会感兴趣。

关于c - 减轻轮询环形缓冲区的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10985336/

相关文章:

c++ - 带互斥量的多线程输入不平滑(如预期)

c - 我试图理解特定的函数指针和赋值

c - 这个未使用的参数错误是什么?

c# - 如何确保一个线程恰好在特定数量的其他线程运行结束后运行?

Java 倒计时与线程

c - 单个生产者和多个消费者

c - 双线性插值图像调整大小标记 & 'splotches'

c - 在 C/Linux 中显示不断更新的图像的简便方法

python - 这种 Python 生产者-消费者无锁方法是线程安全的吗?

c - 通知多个线程同时开始工作