当前位置: 首页 > 知识库问答 >
问题:

Qt中的最佳生产者/消费者线程模式

周飞
2023-03-14

我已经使用Qt线程实现了生产者/消费者模式。多个生产者线程生成由消费者组合的数据。使用信号/时隙和排队连接实现通信。只要使用者能够比生产者线程更快地消耗数据,这就可以正常工作。

很难使我的代码缩放。特别是增加生产者的数量很容易,但很难产生一个以上的消费线程。

现在,当在具有许多内核的CPU/系统上运行软件时,问题就出现了。在这种情况下,我使用更多的线程来产生数据。有时会发生(取决于数据生成的复杂性)消费者不能及时处理生成的数据。然后,Qt事件队列会很快被事件填满,内存消耗会急剧增加。

我可以通过使用阻塞排队的连接来解决此问题。然而,这不允许完全的CPU负载,因为生产者倾向于在每次数据发射后不必要地等待消费者。

在非Qt软件中,我会使用一个固定大小的队列/邮箱/环形缓冲区,让生产者Hibernate,直到消费者释放容器中的空间。这种机制限制了内存消耗,并允许尽可能好的CPU负载。

然而,我无法使用Qt类找到等价的解决方案。事件队列是全局的,没有大小属性。有没有一个Qt的方法可以最优的解决这个问题?如果没有,有没有STL类可以用来耦合(Q)线程?

共有1个答案

从智志
2023-03-14

在这种情况下,我认为您应该放弃使用Qt,因为尽管事件处理速度非常快,但它显然不是为面向众核的HPC工作负载而设计的(因为集中式顺序事件队列)。所以我认为你应该使用快速原子多生产者/多消费者(MPMC)队列。虽然您可以在此基础上编写一个Qt事件层,但我不确定这在性能方面是否是一个好主意。另一个解决方案是使用可变大小的块来减少事件的数量(在生产者和消费者之间有一个反馈环)。请注意,对于您的工作负载,考虑使用基于任务的运行时可能是好的(众所周知可伸缩性很好)。

如果您正在寻找快速的MPMC队列,则Boost(boost::lockfree::queue)提供的队列不是很快,但这通常就足够了。我所知道的最好的一个就是这个。它基于研究论文并用于大型游戏。在我的机器上,这个在特定情况下略快,并且更灵活,但在使用它时应该非常小心,因为并不总是确保一致性(即阅读文档)。请注意,线程库在队列的选择中无关紧要。

 类似资料:
  • 生产者线程与消费者线程使用信号量同步 生产者线程与消费者线程使用信号量同步 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-08-24 yangjie the f

  • 一、线程间通信的两种方式 1.wait()/notify() Object类中相关的方法有notify方法和wait方法。因为wait和notify方法定义在Object类中,因此会被所有的类所继承。这些方法都是final的,即它们都是不能被重写的,不能通过子类覆写去改变它们的行为。 ①wait()方法: 让当前线程进入等待,并释放锁。 ②wait(long)方法: 让当前线程进入等待,并释放锁,

  • 我正在编写一个程序,其中几个生产者生成一些应该由几个消费者处理的数据。由于每条数据的消耗大约需要100ms,而目标平台有很多处理器,所以在我看来,每个生产者和每个消费者都得到自己的线程似乎是很自然的。我的问题是:Qt信号/插槽是将数据块从生产者传递到消费者的好方法吗?还是建议更好的解决方案(强烈首选Qt)。 为了防患于未然,制作者每小时产生几十万个数据。

  • 我有一个生产者/消费者模式,如下所示 固定数量的生成器线程,每个线程写入它们自己的BlockingQueue,通过执行器调用 单个使用者线程,读取生产者线程 每个生产者都在运行一个数据库查询,并将结果写入其队列。消费者轮询所有生产者队列。目前,如果出现数据库错误,生产者线程就会死掉,然后消费者就会永远停留在产品队列中等待更多的结果。 我应该如何构造它来正确处理catch错误?

  • 我有两个线程的问题,似乎没有正确同步。我基本上有一个布尔值名为“已占用”。当没有线程启动时,它被设置为false。但是当一个线程启动时,线程集被占用是真的,我有一个类,它有线程(run),它们调用下面的函数。 这是一个模拟银行的示例,它接收一个金额(初始余额),然后随机执行取款和存款。我的教授提到了一些关于从取款线程到存款线程的信号?这是怎么回事?在提取线程中,它应该运行到余额为2低,并等待存款线

  • 问题内容: 我想创建某种线程应用程序。但是我不确定在两者之间实现队列的最佳方法是什么。 因此,我提出了两个想法(这两个想法可能都是完全错误的)。我想知道哪种更好,如果它们都烂了,那么实现队列的最佳方法是什么。我关心的主要是这些示例中队列的实现。我正在扩展一个内部类的Queue类,它是线程安全的。下面是两个示例,每个示例有4个类。 主班 消费阶层 生产者类别 队列类 要么 主班 消费阶层 生产者类别