服务器控制1个写入器实时连续生成数据帧和N个可能的并发读取请求。每当读者向服务器发出请求时,读者应该能够获得最新产生的帧或等待它(如果不可用)。虽然允许N个不同的阅读器同时“消费”同一帧,但每个阅读器不得多次读取同一帧。
上述问题是否有任何众所周知的算法或策略,不会浪费太多资源并为读者提供良好的吞吐量?
现在我的想法是使用所谓的“三重缓冲”(每帧一个缓冲区),其中两个缓冲区由写入器填充,并且一个缓冲区由并发读取器共享。如果并发读数的数量为0,则一旦生成一个帧,就可以将相应的缓冲区与专用于读取器的缓冲区交换。这似乎是一个简单的模型,尽管所有并发读者可能会受到该组中最慢读者的时间的影响。关于确保一个阅读器不能两次获得相同帧的问题仍然需要通过适合上述模型的干净方式进行某种同步来解决。
如果您有任何其他想法或代码(在现代C ++中更受欢迎),C ++库......我会很感激。
答案 0 :(得分:3)
项目Disruptor的领导者:Martin Thompson有这个新项目:Aeron而且速度非常快。更重要的是,它已经支持C ++ api。查看高可扩展性的介绍视频和文章:
https://www.youtube.com/watch?v=tM4YskS94b0 http://highscalability.com/blog/2014/11/17/aeron-do-we-really-need-another-messaging-system.html
答案 1 :(得分:1)
如果我理解你的问题,你可以在这里使用disruptor模式。它使用环形缓冲区在线程之间有效地传递数据。见multicast events section here。 LMAX破坏者最初是written in java,尽管c ++存在一些实现。请参阅pure c version,c++11 version和another c++ version。另外,你见过intel thread building blocks library吗?它有一些有用且高效的并发数据结构,调度程序,c ++的同步原语。希望这会有所帮助...