首页 > 解决方案 > 同步两个线程

问题描述

有两个线程data_collect_threaddata_process_thread

data_collect_thread收集数据并将数据推送到队列中,该队列比data_process_thread从队列中取出数据并处理它的速度快 4 倍。

在这种情况下,与将数据推送到队列相比,由于出队速度较慢,堆在一段时间后会溢出。

我不能等到data_collect_thread处理data_process_thread数据。我需要获取实时数据而不会丢失。

请建议一种算法来避免这个问题?

更多细节:

队列是一个双向链表,所以我需要在堆中分配内存并将其推送到队列中。出队后,内存被释放。

标签: cmultithreadingsynchronization

解决方案


想象一下,您有一个水箱,您不断地向其中抽水。您还通过一根小管道将水从水箱中取出。除非您以比泵入更快的速度去除水,否则水箱迟早会溢出数据处理也是如此。您必须以等于或快于生成数据的速率来使用数据,否则您迟早会耗尽内存。这是生活中的事实。

如果数据以突发形式出现,并且有一些停机时间,那么您可以通过使用足够大的缓冲区来保存数据一段时间,从而避免处理速度变慢。但是在您的情况下,您似乎正在以固定速率连续进行流式传输或采样。

既然您说您无法控制数据到达的速度,那么您唯一的其他选择就是进行优化data_process_thread(),使其运行速度快于数据到达的速度。2.5ms 似乎足以进行大量处理。仔细查看您的处理代码并对其进行分析,以了解它在哪里花费了 CPU 时间。然后尝试对其进行优化以使其运行得更快。

PS:我刚刚在您的评论中看到您正在从 I2C 阅读。假设您是或某种嵌入式微控制器,如果您的微控制器支持,请尝试使用 DMA 将数据从 I2C 外设复制到内存。减少中断的数量可能会为您腾出更多的 CPU 时间进行处理。


推荐阅读