PA中的生产者和消费者

问题描述

生产者—消费者问题是相互合作的线程关系的一种抽象,例如在数据组包时,DSP,FPGA线程是生产者,打包线程是消费者;而在数据显示时,则打包线程是生产者,显示线程是消费者。因此该问题有很大的代表性及实用价值。

下面我们就以PA8000中的数据组包过程中遇到的生产者—消费者问题简单介绍这个多线程同步问题。下图是三个线程之间的关系:

1、DSP线程
从DSP共享内存区读取数据分包放入仓库,如果缓冲区满则等待。

2、 FPGA线程
从FPGA共享内存区读取数据分包放入仓库,如果缓冲区满则等待。

3、数据打包线程
从缓冲区中取出分包,根据同步ID组装成一个完整包,如果缓冲区空则等待。

解决方法

假定在生产者和消费者之间的公用缓冲池中,具有n个缓冲区,这时可以使用互斥信号量mutex实现诸线程对缓冲池的互斥使用;利用计数信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。又假定这些生产者和消费者相互等效,只要缓冲池未满,生产者便可将数据分包送入缓冲池;只要缓冲池未空,消费者便可从缓冲池中取走一个分包,对生产者—消费者问题解决方案可描述如下图:

在生产者—消费者问题中应注意:首先,在每个线程中用于实现互斥的wait(mutex)和signal(mutex)必须成对地出现;其次,对计数信号量empty和full的wait和signal操作,同样需要成对地出现,但他们分别处于不同的线程中。例如wait(empty)在DSP线程中,而signal(empty)则在数据打包线程中,DSP线程若因wait(empty)而阻塞,则以后将由数据打包线程将它唤醒;最后,在每个线程中的多个wait操作顺序不能颠倒,应先执行对计数信号量的wait操作,然后再执行对互斥信号量的wait操作,否则可能引起线程死锁。