【问题标题】:Real time data streaming with 1 writer and N concurrent readers具有 1 个写入器和 N 个并发读取器的实时数据流
【发布时间】:2015-01-25 20:03:51
【问题描述】:

服务器控制 1 个写入器实时连续生成数据帧和 N 个可能的并发读取请求。每当阅读器向服务器发出请求时,阅读器应该能够获取最新生成的帧或等待它(如果不可用)。虽然允许 N 个不同的读取器同时“消费”同一帧,但每个单独的读取器读取同一帧的次数不得超过一次。

对于上述问题,有没有什么众所周知的算法或策略,既不会浪费太多资源,又能给读者带来良好的吞吐量?

现在我的想法是使用所谓的“三重缓冲”(每帧一个缓冲区),其中两个缓冲区由写入器交替填充,一个缓冲区由并发读取器共享。如果并发读取的数量为 0,则一旦产生了帧,则可以将相应的缓冲区与专用于读取器的缓冲区交换。这似乎是一个简单的模型,尽管所有并发读者可能会受到组中最慢读者的时间的影响。确保一个阅读器不能两次获得相同帧的问题仍然需要通过某种符合上述模型的干净方式进行同步来解决。

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

【问题讨论】:

    标签: c++ multithreading performance algorithm concurrency


    【解决方案1】:

    项目 Disruptor 的负责人:Martin Thompson 有这个新项目: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

    【讨论】:

    • np :) 不过这还是很新的。我订阅了高扩展性,这就是我所知道的。 :)
    【解决方案2】:

    如果我正确理解了您的问题,您可以在此处使用中断模式。它使用环形缓冲区在线程之间有效地传递数据。见multicast events section here。 LMAX 破坏者最初是 written in java,尽管 C++ 存在一些实现。请参阅pure c versionc++11 versionanother c++ version。另外,你见过intel thread building blocks library吗?它具有一些有用且高效的并发数据结构、调度程序、c++ 同步原语。希望这会有所帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      • 2021-10-12
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      相关资源
      最近更新 更多