我需要一个支持索引的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[]
遍历整个容器。
但是在启动时,这些元素不会被清零。我认为它有一个更加方便的界面。容器最初是空的,插入将增加大小,直到达到最大大小。