c++ - 选择适当的FIFO数据结构

标签 c++ data-structures

我需要一个支持索引的FIFO结构。每个元素都是数据数组,保存在我正在读取的设备上。 FIFO具有恒定的大小,并且在启动时将每个元素清零。

以下是一些伪代码可以帮助您理解此问题:

Thread A (Device Reader):
1. Lock the structure.
2. Pop oldest element off of FIFO (don't need it).
3. Read next array of data (note this is a fixed size array) from the device.
4. Push new data array onto the FIFO.
5. Unlock.

Thread B (Data Request From Caller):
1. Lock the structure.
2. Determine request type.
3. if (request = one array) memcpy over the latest array saved (LIFO).
4. else memcpy over the whole FIFO to the user as a giant array (caller uses arrays).
5. Unlock.


请注意,不应在线程B中更改FIFO,调用方应仅获得一个副本,因此,如果没有中间副本,则pop具有破坏性的数据结构不一定会起作用。

我的代码也已经具有boost依赖性,并且我在其他地方使用了无锁的spsc_queue。话虽如此,由于在某些情况下需要作为LIFO工作,并且有时需要遍历整个FIFO,因此我看不到此队列如何为我工作。

我也考虑过普通的std::vector,但是当我不断地弹跳时,我担心性能。

最佳答案

我建议您使用boost::circular_buffer,这是一个固定大小的容器,支持随机访问迭代,在开始和结束时进行恒定时间插入和擦除。您可以将其用作push_back()的FIFO,读取back()以获取最新保存的数据,并通过begin(), end()或使用operator[]遍历整个容器。

但是在启动时,这些元素不会被清零。我认为它有一个更加方便的界面。容器最初是空的,插入将增加大小,直到达到最大大小。

关于c++ - 选择适当的FIFO数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32745282/

相关文章:

c++ - 迭代器 VS const_iterator,与 distance() 一起使用

C++ 修复 OpenCV squares.cpp 示例以合并封闭的正方形

c++ - 使用 MapViewOfFile 映射大文件

c++ - 你能解释一下指针和递归结构吗

algorithm - 汉诺塔使用头部递归?

c++ - 如何在 Qt 中缩放具有子像素宽度的线?

algorithm - 如何找到计算时间小于 O(n) 的以下类型的集合?

java - 对于以变量集作为键的映射,我应该使用什么数据结构?

algorithm - 霍夫曼算法中二进制编码的长度?

c++ - 结束时控制台崩溃(循环)未超出范围错误