【问题标题】:Synchronize two threads同步两个线程
【发布时间】:2020-01-28 08:32:14
【问题描述】:

有两个线程data_collect_threaddata_process_thread

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

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

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

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

更多细节:

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

【问题讨论】:

  • 呃,开始更多 data_collect_thread 以便他们跟上?我认为没有算法可以解决这个问题。显然队列和代码必须是线程安全的,等等。
  • 检查data_collect_thread是否可以有多个实例,以处理输入。
  • 您可以运行 4 个 data_process_thread 实例,然后旋转它们。只有当你有 5 个核心时才有效。一个采集时间真的是您采集实时数据所需的频率还是可以降低周期?
  • 您应该在有关数据收集和处理的问题中添加更多详细信息。 (您到底要做什么?)数据收集线程会永久发送数据,还是会在一段时间间隔内收到突发数据,而没有新数据?队列是如何实现的?
  • 买一台速度快四倍的电脑

标签: c multithreading synchronization


【解决方案1】:

这个问题太宽泛,无法给出具体答案,但无论如何,恕我直言很有趣。所以我会给出一些解决方案。

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

我可能会补充一点,如果您对问题添加足够多的约束,它可能会变得无法解决。

【讨论】:

    【解决方案2】:

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

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

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

    PS:我刚刚在您的 cmets 中看到您正在从 I2C 读取。假设您是或某种嵌入式微控制器,如果您的微控制器支持,请尝试使用 DMA 将数据从 I2C 外设复制到内存。减少中断次数可能会释放更多 CPU 时间用于处理。

    【讨论】:

      【解决方案3】:

      你有两个选择:

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

      如果您想处理所有数据,那么您需要尽可能快地处理数据。因此,您要么需要更快的计算机,要么需要更多的计算机,要么需要更快的处理算法。句号。这些是您唯一可以做的事情。

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

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

      【讨论】:

      • 是的,我需要处理它的所有数据。所以我需要一台更快的电脑。我无法优化我当前的算法,处理任务中耗时的是无线电传输。
      • @TiYan 如果这是一个微控制器(猜测,因为它是一个 i2c 传感器)你很幸运。如果您有一台台式计算机并且需要一台速度快 4 倍的计算机,那么您可能很难找到一台。但可能很容易找到另一个比您的微控制器快 4 倍的微控制器。
      • 是的,它是一个微控制器。感谢您的大力支持。
      • '无线电发射'???这是一个不需要 CPU 的 I/O 操作。买个1024核的超级电脑,根本没用:((
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      相关资源
      最近更新 更多