gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:11:42 25 4
gpt4 key购买 nike

我需要一个支持索引的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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com