具有 1 个写入器和 N 个并发读取器的实时数据流

Real time data streaming with 1 writer and N concurrent readers

一个服务器控制1个写入器实时连续生产数据帧和N个可能的并发读请求。每当 reader 向服务器发出请求时,reader 应该能够获取最新生成的帧或等待它(如果不可用)。尽管允许 N 个不同的 reader 并发 "consume" 同一帧,但每个人 reader 不得多次读取同一帧。

对于上述问题,有没有什么著名的算法或策略,既不会浪费太多资源,又能给readers一个很好的吞吐量?

目前我的想法是使用所谓的"triple buffering"(每帧一个缓冲区),其中两个缓冲区由编写器交替填充,一个缓冲区由并发reader共享.如果并发读取数为0,则一旦产生一帧,就可以将相应的缓冲区与专用于reader的缓冲区进行交换。这似乎是一个简单的模型,尽管所有并发的 reader 可能会受到组中最慢 reader 的计时的影响。关于确保一个 reader 无法两次获得同一帧的问题仍然需要通过某种适合上述模型的干净方式的同步来解决。

如果您有任何其他想法或代码(首选现代 C++),C++ 库...我将不胜感激。

如果我没有正确理解你的问题,你可以在这里使用破坏者模式。它使用环形缓冲区在线程之间有效地传递数据。看到 multicast events section here. The LMAX disruptor was originaly written in java, though some implementation exists for c++. See pure c version, c++11 version and another c++ version. Also, have you seen intel thread building blocks library?它有一些有用且高效的并发数据结构、调度程序、用于 C++ 的同步原语。希望这有助于...

项目 Disruptor 的负责人:Martin Thompson has this new project: Aeron 而且速度非常快。更重要的是,它已经支持 C++ api。查看 highscalability 的介绍视频和文章:

https://www.youtube.com/watch?v=tM4YskS94b0 http://highscalability.com/blog/2014/11/17/aeron-do-we-really-need-another-messaging-system.html