生产者/消费者与Qt信号/槽

Producers/consumers with Qt signals/slots

本文关键字:信号 Qt 消费者 生产者      更新时间:2023-10-16

我正在编写一个程序,其中几个生产者生成一些数据,这些数据应该由几个消费者处理。由于每个数据块的消耗大约需要100ms,并且目标平台有许多处理器,因此对我来说,每个生产者和每个消费者都有自己的线程似乎是很自然的。我的问题是:Qt信号/槽是将数据块从生产者传递到消费者的好方法吗?或者你建议一个更好的解决方案(Qt是强烈首选)。

为了以防相关,生产者大约每小时产生数十万个数据。

我不认为信号/插槽机制在这里是合适的,因为每个信号被分配到所有连接的插槽。这意味着如果你使用信号/槽机制作为你的"工作队列",你不会在消费者上得到任何负载分配,而是所有的消费者都做同样的(重复的)工作。

一个更好的机制是使用容器作为工作队列(生产者向容器中添加项目,消费者删除它们),使用QMutex来避免并发问题,使用一个(或两个,如果你想施加最大大小)QWaitCondition来阻塞没有工作的消费者。

我建议您避免使用信号和槽,因为它们充当事件,因此一旦发出信号,您就无法控制执行。因此,我建议您使用锁或互斥锁(例如QMutex)来实现互斥。只需使用QMutex类中的锁和解锁方法来保护您的队列。我认为它会比使用信号和槽更快,因为如果你传递对象,它会传递对象的副本,在你传递指针的情况下,你不会保护对象。

欢呼,