c - 同步两个线程
问题描述
有两个线程data_collect_thread
和data_process_thread
。
data_collect_thread
收集数据并将数据推送到队列中,该队列比data_process_thread
从队列中取出数据并处理它的速度快 4 倍。
在这种情况下,与将数据推送到队列相比,由于出队速度较慢,堆在一段时间后会溢出。
我不能等到data_collect_thread
处理data_process_thread
数据。我需要获取实时数据而不会丢失。
请建议一种算法来避免这个问题?
更多细节:
队列是一个双向链表,所以我需要在堆中分配内存并将其推送到队列中。出队后,内存被释放。
解决方案
想象一下,您有一个水箱,您不断地向其中抽水。您还通过一根小管道将水从水箱中取出。除非您以比泵入更快的速度去除水,否则水箱迟早会溢出。数据处理也是如此。您必须以等于或快于生成数据的速率来使用数据,否则您迟早会耗尽内存。这是生活中的事实。
如果数据以突发形式出现,并且有一些停机时间,那么您可以通过使用足够大的缓冲区来保存数据一段时间,从而避免处理速度变慢。但是在您的情况下,您似乎正在以固定速率连续进行流式传输或采样。
既然您说您无法控制数据到达的速度,那么您唯一的其他选择就是进行优化data_process_thread()
,使其运行速度快于数据到达的速度。2.5ms 似乎足以进行大量处理。仔细查看您的处理代码并对其进行分析,以了解它在哪里花费了 CPU 时间。然后尝试对其进行优化以使其运行得更快。
PS:我刚刚在您的评论中看到您正在从 I2C 阅读。假设您是或某种嵌入式微控制器,如果您的微控制器支持,请尝试使用 DMA 将数据从 I2C 外设复制到内存。减少中断的数量可能会为您腾出更多的 CPU 时间进行处理。
推荐阅读
- php - 高效加载或缓存视图,即基于许多嵌套关系
- javascript - 选择要以编程方式使用的 api
- python - Pandas:如果无序,则跨列对 DataFrame Cellls 进行排序
- reactjs - React Router - 如何在页面刷新时执行onclick?
- django - 使用 create-react-app 自定义静态文件的路径?
- ios - hidesBackButton 不起作用,即使在 viewDidLoad
- sql - 从 sp_executesql 检索列定义
- php - htmlentities() 转义输出不显示正确的内容
- python - pipenv:术语“pipenv”未被识别为 cmdlet 的名称
- javascript - 如何使用 VSCODE 或 PyCharm 通过 SSH 工作并要求提高权限?