我正在设计一个系统,它连接到一个或多个数据源流,并对数据做一些分析,而不是根据结果触发事件。在典型的多线程生产者/消费者设置中,我将有多个生产者线程将数据放入队列,多个消费者线程读取数据,消费者只对最新的数据点和 n 个点感兴趣。如果缓慢的消费者无法跟上,生产者线程将必须阻塞,当然,如果没有未处理的更新,消费者线程将阻塞。使用带有读/写锁的典型并发队列将会很好地工作,但是数据传入的速率可能会很快,所以我想减少我的锁开销,特别是为生产者的写锁。我想我需要的是一个环形的无锁缓冲区。
现在有两个问题:
循环无锁缓冲区是答案吗?
如果是的话,在我开始我自己的工作之前,你知道有什么公开的实现可以满足我的需要吗?
实现循环无锁缓冲区的任何指针都是受欢迎的。
顺便说一句,在 Linux 上用 C + + 做这件事。
附加信息:
响应时间对我的系统至关重要。理想情况下,使用者线程希望尽快看到任何更新,因为额外的1毫秒延迟可能会使系统变得毫无价值,或者价值大大降低。
我倾向的设计理念是一个半无锁循环缓冲区,生产者线程尽可能快地将数据放入缓冲区,让我们调用缓冲区的头 A,除非缓冲区已满,当 A 满足缓冲区 Z 的末尾时,不会阻塞。消费者线程将每个持有两个指向循环缓冲区的指针,P 和 PN,其中 P 是线程的本地缓冲区头,PN是 P 之后的第 n 个项目。每个消费者线程将推进它的 P 和 PN,一旦它完成处理当前的 P 和缓冲区指针 Z 的末尾是推进最慢的 PN。当 P 赶上 A 时,这意味着不再有新的更新需要处理,使用者旋转并忙碌地等待 A 再次前进。如果使用者线程运行太长时间,它可以进入休眠状态,等待条件变量,但我不介意使用者占用 CPU 周期等待更新,因为这不会增加我的延迟(我将有更多的 CPU 核心比线程)。假设你有一个环形轨道,生产者在一群消费者面前运行,关键是调整系统,使生产者通常比消费者快几步,大多数操作可以使用无锁技术完成。我知道获得正确的实现细节并不容易... ... 好吧,非常困难,这就是为什么我想从别人的错误中学习,然后再犯一些我自己的错误。