具有Qt信号/插槽的生产者/消费者

时间:2013-01-19 15:17:30

标签: c++ multithreading qt signals-slots producer-consumer

我正在编写一个程序,其中有几个生产者生成一些应由多个消费者处理的数据。由于每个数据的消耗大约需要100毫秒,目标平台有很多处理器,因此我觉得每个生产者和每个消费者都有自己的线程。我的问题是:Qt信号/插槽是否是将数据块从生产者传递给消费者的好方法?或者你建议一个更好的解决方案(Qt是强烈的首选)。

万一它是相关的,生产者每小时左右会产生数十万的数据。

2 个答案:

答案 0 :(得分:2)

我不认为信号/插槽机制在这里是合适的,因为每个信号都分配给所有连接的插槽。这意味着如果您使用信号/插槽机制作为“工作队列”,则不会对消费者进行任何负载分配,而是所有消费者都可以执行相同(重复)的工作。

更好的机制是使用容器作为工作队列(生产者向容器添加项目,消费者删除它们),使用QMutex以避免并发问题,使用一个(或两个,如果要强制执行)最大尺寸)QWaitCondition以阻止消费者无法为他们工作。

答案 1 :(得分:1)

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

干杯,