首页 理论教育生产者/消费者设计模式优化方案

生产者/消费者设计模式优化方案

【摘要】:生产者/消费者设计模式是利用LabVIEW图形化语言中的队列操作函数、While循环、Case结构、事件结构等组合构成。生产者/消费者设计模式和主/从设计模式之间最大的不同就是数据存储和传输方式的不同。如图5-52所示,生产者与消费者之间传递的数据是一个随机数。当“只生产,不消费”,消费者循环将停止消费,而生产者循环将产生数据直至数据缓冲区填满。

生产者/消费者设计模式中包括两个线程,一个生产数据,另一个消费/使用数据;在线程之间建立缓冲(采用队列实现),确保消费者以自己的步调使用数据,同时允许生产者将更多的数据添加到队列中。如图5-50所示。

978-7-111-49442-3-Chapter05-52.jpg

图5-50 生产者/消费者设计模式示意图

具体来讲,生产者/消费者设计模式将多个并行循环分为生产数据和消费数据的两类循环,循环间采用队列的方式进行通信,这样当产生数据的速度比处理数据的速度快时,队列的缓冲作用保证数据不会丢失。这种模式对于处理需要较长时间才能完成的用户界面事件非常有效。生产者/消费者设计模式是利用LabVIEW图形化语言中的队列操作函数、While循环、Case结构、事件结构等组合构成。

图5-51所示为生产者/消费者设计模式的结构图。其中一个循环通过计算或数据采集等方式产生数据并将数据放入队列;另一循环一直等待直到队列中有数据,然后取出队列中的第一个数据并处理。

978-7-111-49442-3-Chapter05-53.jpg

图5-51 生产者/消费者设计模式结构

一般的,生产者/消费者设计模式是利用LabVIEW图形化语言中的队列操作函数、While循环、Case结构、事件结构等组合构成。

生产者/消费者设计模式和主/从设计模式之间最大的不同就是数据存储和传输方式的不同。生产者/消费者设计模式采用了队列的数据存储方式(FIFO)。队列的数据存储是开辟一个缓存区,依据先进先出的原则进行的。新来的元素总是被加入队尾(即不允许"插队"),每次离开的元素总是队列头上的(即不允许中途离队)当前"最老的"元素离队。这样就保证了数据传递过程中基本上不会发生数据丢失的现象。

【例5-9】传递数据的生产者消费者

本例将演示生产者/消费者循环的一些基本特性和队列操作的特点。如图5-52所示,生产者与消费者之间传递的数据是一个随机数。右上角是“停止”按钮,用户控制程序的停止执行。例程提供了通过调整生产者延时和消费者延时,控制生产者和消费者的数据传递速率,可以包含五种状态:不生产,只消费、生产快于消费、生产速率等于消费速率、生产慢于消费、只生产,不消费。

图5-53所示为生产者/消费者例程的程序框图,代码由3个循环组成,依上而下分别是生产者循环(产生随机数据)、消费者循环(获取并显示随机数据)和状态循环(获得缓存区中数据的数据量),可以实时查看队列缓冲区中存储的元素数量。

978-7-111-49442-3-Chapter05-54.jpg

图5-52 传递数据的生产者消费者前面板

978-7-111-49442-3-Chapter05-55.jpg

图5-53 生产者/消费者程序框图

运行该VI,当“生产速率等于消费速率”时,生产者循环和消费者循环的数据是同步的,此时缓冲区内没有数据,也就是说产生的数据都被实时地消耗了。当“不生产,只消费”时,生产者循环将停止生产,而消费者循环将组件消耗掉缓冲区中的数据直至数据全部消耗完。当“只生产,不消费”,消费者循环将停止消费,而生产者循环将产生数据直至数据缓冲区填满。