我正在设计一个系统,它连接到一个或多个数据流并对数据进行分析,然后根据结果触发事件。在典型的多线程生产者/消费者设置中,我将有多个生产者线程将数据放入队列中,多个消费者线程读取数据,并且消费者仅对最新数据点加上n个点感兴趣。如果慢的消费者无法跟上,则生产者线程必须阻塞,当没有未处理的更新时,消费者线程当然会阻塞。使用带有读者/写者锁的典型并发队列可以很好地工作,但是数据的输入速率可能很快,因此我想减少锁定开销,尤其是针对生产者的写锁。我认为循环无锁缓冲区就是我需要的。
现在有两个问题:
循环无锁缓冲区是答案吗?
如果是,那么在自己编写代码之前,您知道任何公共实现可以满足我的需求吗?
欢迎提供有关实现循环无锁缓冲区的任何指针。
顺便说一下,在Linux上使用C++实现。
一些额外的信息:
对于我的系统来说,响应时间至关重要。理想情况下,消费者线程希望尽快看到任何更新,因为额外的1毫秒延迟可能使系统变得无价值,或者价值大大降低。
我倾向于采用一种半无锁循环缓冲区的设计思路,生产者线程以最快的速度将数据放入缓冲区中,我们称缓冲区头部为A,除非缓冲区已满,否则不会阻塞生产者线程,当A到达缓冲区尾部Z时才会阻塞。每个消费者线程将持有两个指针指向循环缓冲区,P和Pn,其中P是线程的本地缓冲区头部,Pn是P后第n个项目。每个消费者线程在处理完当前的P并且慢est Pn指向缓冲区结尾Z时,将推进它的P和Pn。当P赶上A时,这意味着没有更多新的更新需要处理,消费者线程就会旋转并忙等待A再次前进。如果消费者线程旋转时间过长,可以将其置于睡眠状态,并等待条件变量,但我认为消费者线程占用CPU周期等待更新也可以,因为这不会增加我的延迟(我将拥有比线程更多的CPU核心)。想象一下你有一个循环轨道,生产者在一群消费者前面奔跑,关键是调整系统,使得生产者通常只比消费者领先几步,大多数操作都可以使用无锁技术完成。我明白实现细节并不容易...好吧,非常难,这就是为什么在犯错之前我想从别人的错误中学习的原因。