c++ - 大数据共享数组
问题描述
我有两个线程。第一个是从 USB 将数据写入大数组(主缓冲区)中。每次从 USB 获取新数据时,偏移量(写入偏移量)都会增加。在第二个线程中,有一个“读取偏移量”,当从主缓冲区中提取新数据时,它也会增长。
一个线程正在写入,下一个线程正在读取。
但是这个解决方案没有优化。我需要一个更大的阵列来满足我的不同要求。我需要动态行为来使用在两个或多个线程之间共享的内存。
我确信有很多有用的算法可以解决我的问题。
任何人都可以推荐其中一些,好吗?[C(++) 语言]
解决方案
我在 C++ 中做过类似的事情。我首先构建了一个缓冲区列表——一个空闲列表——,然后用我从malloc()
or获得的两个空缓冲区填充它new
。然后我的传入数据线程这样做了
如果列表中有一个空缓冲区,则将其从列表中取出并开始写入。
malloc()
如果此列表中没有缓冲区,我会从or中获得另一个缓冲区new
。当活动缓冲区填满时,我将其放入队列并抓取另一个。
我的消费者线程,另一个,从队列中拉出缓冲区,做需要的事情,并将缓冲区放回空闲列表中。
该方案比您描述的环形缓冲区方案效果更好,因为它可以在需要时添加缓冲区。
当您将缓冲区放入队列或空闲列表或将它们取出时,您需要使用线程安全操作。为队列和空闲列表使用适当的线程安全标准库集合。
您也可以使用环形缓冲区,当它不够大时,可以使用realloc
1.5 倍大小的新缓冲区并复制数据。
推荐阅读
- excel - 格式化选定范围宏
- laravel - 如果找不到特定目录的文件,则重定向到主页
- kubernetes - 缺少 kubernetes 默认 API 资源定义
- django - 如何使用开始和结束日期设置日期过滤器 django rest 框架
- java - 日光一小时时差的 Kotlin 问题
- ios - Xcode中UIScrollView的问题
- c# - 跨上下文加入 asp.net 核心
- python - 如何使用 ``pyaudio`` 选择``sounddevice`` 中的``mapping`` 之类的输入通道?
- r - 为什么使用 GLMM 的 Gamma 分布会出错?
- python - 如何在没有用元素定义 cmp 运算符的 Python3 中对列表进行排序?