【问题标题】:Mitigate effects of polling ring buffers减轻轮询环形缓冲区的影响
【发布时间】:2012-06-12 03:37:42
【问题描述】:

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

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

我正在考虑忙于检查指针位置是否为 0;我不介意成为 CPU 猪。

我要提的是每个线程都是由SCHED_FIFO的cpuset和soft RT,当然c实现了。

【问题讨论】:

  • 你是在linux上做这个吗?它必须是便携式的吗?
  • Fedora/Rhel 并且没有不可移植,你是否暗示中断?
  • 您能详细说明一下您的设置吗?您是否希望在工作人员之间平均分配来自生产者的数据?数据是否以数据包/工作单元为单位?
  • 消费者准备好消费下一个单位的时间是常数吗? (-> 单位的循环分配是否足够公平?)
  • Io 数据将从网上流出,生产者应分发给免费的消费者。线程绑定核心无需使用linux调度器

标签: c multithreading producer-consumer


【解决方案1】:

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

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

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

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

【讨论】:

  • 我想避免任何和所有可能的系统调用。互斥体涉及一个或两个系统调用,不是吗?让消费者不断读取变量以检查 1 然后处理循环缓冲区中的任何数据,从而消除对互斥体的需求会有什么问题?
  • 这很可能会导致所有消费者获取相同的数据,然后对其进行处理,重复。有效地消除了多线程的优势,因为所有线程都冗余地做同样的事情。请记住,如果没有锁,您无法读取指针并以原子方式写入指针。您可以尝试使用比较和交换 CPU 指令构建一些东西,但这也不像听起来那么简单。也许更详细地说明您在问题中要达到的目标,因为该方法在很大程度上取决于您的要求。
  • 我的线程非便携式 linux 的低延迟专用内核。还有什么?
猜你喜欢
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
相关资源
最近更新 更多