使用Qt信号/槽的生产者/消费者

3
我正在编写一个程序,其中几个生产者生成一些数据,这些数据应该由几个消费者处理。由于每个数据块的消耗时间大约为100ms,并且目标平台有很多处理器,因此我认为每个生产者和每个消费者都应该有自己的线程。我的问题是:Qt信号/槽是否是将数据块从生产者传递到消费者的好方法?或者你建议更好的解决方案(强烈推荐使用Qt)。
以防相关性,生产者每小时会爆发出数十万个数据块。

没问题。不过,看一下这个视频,特别是从27分钟开始(跨线程信号槽):Qt Developer Days 2011 - Multithreading - leemes
2个回答

2
我认为在这里使用信号/槽机制并不合适,因为每个信号都会分发给所有连接的槽。这意味着,如果你将信号/槽机制用作你的“工作队列”,你就无法在消费者之间进行负载分配,而是所有消费者都要做相同的(重复的)工作。
更好的机制是使用容器作为工作队列(生产者向容器添加项目,消费者删除它们),使用QMutex避免并发问题,并使用一个(或两个,如果你想强制限制大小)QWaitCondition在没有工作时阻止消费者。

回顾我的情况,我觉得这似乎是最好的选择。我在Qt中找不到一个线程安全的队列类,就像Python标准库中的那个一样,所以我只能使用互斥锁和等待条件。虽然并不是非常困难,但我们程序员都有点懒!如果您知道更好的方法,请告诉我。谢谢您的帮助。 - Elektito
我认为写一个真正通用的线程安全队列是不可能的,因为每个项目对该队列的要求都不同。只需编写符合您的同步需求并在底层使用非线程安全容器的自己的队列即可。 - Bart van Ingen Schenau

1
我建议你避免使用信号和槽,因为它们像事件一样,一旦发出信号,你就无法控制执行。所以,我建议你使用锁或互斥量(例如QMutex)进行互斥。只需使用QMutex类的lock和unlock方法来保护你的队列即可。我认为这比使用信号和槽更快,因为如果你传递对象,它将传递对象的副本,在你传递指针的情况下,你不会保护对象。

祝好!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接