实时应用的数据结构

Xin*_*nus 5 c++ sockets p2p data-structures

我们正在使用 C++ 设计一个 p2p 应用程序,它使用 UDP 将语音传输到其他对等点。

我们正在线程中的缓冲区捕获麦克风信号,该线程在while循环中捕获语音一秒钟。对于每一个第二语音捕获的在缓冲液中它分裂成数据包,并发送至其它对等。现在我需要在目的地有一个合适的数据结构来处理实时传输。我将用于屏幕捕获的相同数据结构。这是我想到的两种使用队列的方法

  • 使用链表实现队列,该链表在图像的情况下维护OneSecVoice对象或Image对象队列。

  • 使用OneSecVoiceImage对象的静态数组实现队列

OneSecVoice/Image对象将包含数据总数,数据缓冲区用于该特定Image/OneSecVoice

由于它是实时的,一个线程将不断扫描队列并通过弹出来自队列的方式取出最新的完成Image/OneSecVoiceImage/OneSecVoice

所以要选择使用链表实现一个队列使用静态数组实现一个队列

我和我的朋友正在为此争吵,所以我们决定在这里发帖。

fni*_*eto 5

我会使用boost::circular_buffer。您将获得具有固定内存区域和没有意外内存分配的缓存优势。

为了实现最大效率,circular_buffer 将其元素存储在连续的内存区域中,然后启用:

  1. 使用固定内存并且没有隐式或意外的内存分配。
  2. 从正面和背面快速恒定时间插入和移除元素。
  3. 元素的快速恒定时间随机访问。
  4. 适用于实时和性能关键应用程序。

circle_buffer 的可能应用包括:

  • 存储最近收到的样本,在新样本到达时覆盖最旧的样本。
  • 作为有界缓冲区的底层容器(参见有界缓冲区示例)。
  • 一种缓存,存储指定数量的最后插入的元素。
  • 高效的固定容量 FIFO(先进先出)或 LIFO(后进先出)队列,在满时移除最旧(作为第一个插入)元素。