同步两个线程

时间:2020-01-28 08:32:14

标签: c multithreading synchronization

有两个线程data_collect_threaddata_process_thread

data_collect_thread收集数据并将数据推送到队列中,该速度是data_process_thread的4倍,后者从队列中取出数据并进行处理。

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

我无法在data_collect_thread中等待data_process_thread处理数据。我需要获取实时数据而不会丢失任何内容。

请提出一种避免该问题的算法?

更多详细信息:

队列是一个双向链接列表,因此我需要在堆中分配内存并将其推入队列。出队后,内存被释放。

3 个答案:

答案 0 :(得分:0)

这个问题太宽泛,无法给出具体答案,但是无论如何,恕我直言很有趣。因此,我将提供一些解决方案。

  • 购买一台速度快四倍的计算机。
  • 创建更多data_process_thread实例。如果您有多个核心,可能会起作用。
  • 优化data_process_thread的算法和/或代码。
  • 完全重写data_process_thread以在gpu上运行。
  • 使用负载均衡器创建计算机集群。
  • 将队列后台处理到磁盘。如果您在数据流中遇到一些暂停,可能会起作用。

我可能还要补充一点,如果您对问题添加了足够的约束,那么结果可能无法解决。

答案 1 :(得分:0)

想象一下,您有一个不断向其注水的水箱。您还将通过一条小管道将水从水箱中取出。除非您以比注入水快的速度去除水,否则水箱迟早会始终溢出。在数据处理中也是如此。您必须以等于或高于产生数据的速度消耗数据,否则迟早会耗尽内存。这是生活中的事实。

万一数据突然爆发,并且出现了一些停机时间,那么您可以通过使用足够大的缓冲区将数据保留一段时间来避免处理速度变慢。但就您而言,您似乎正在以固定速率连续进行流式传输或采样。

由于您说您无法控制数据到达的速度,因此您唯一的选择是优化data_process_thread(),使其运行速度快于数据到达的速度。 2.5毫秒似乎足以进行大量处理。仔细检查您的处理代码并对其进行配置,以了解它在CPU时间上所花费的时间。然后尝试对其进行优化以使其运行更快。

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

答案 2 :(得分:0)

您有两种选择:

  • 处理所有数据。
  • 不处理所有数据。

如果要处理所有数据,则需要尽快处理它们。因此,您需要一台速度更快的计算机或更多台计算机,或者速度更快的处理算法。句号这些是您唯一可以做的事情。

如果您不想处理所有数据,可以这样做,以便如果队列中已有太多数据,则收集线程将删除数据(而不是将其放入队列)。

这些是您的选择。选择一个。

相关问题