1.实验目的
本实验的目的是通过编写和调试一个解决生产者-消费者问题的简单模拟程序,进一步深入理解课堂教学中讲授的进程同步问题,以及用于解决同步问题的信号量机制的基本思想,即通过研究进程同步和信号量机制实现生产者消费者问题的并发控制,以便阶段性的巩固学习成果。
2.实验内容以及概述
(1)概述
说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1~20这20个整型数。
编制程序模拟解决生产者-消费者同步问题。具体设计要求:
1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费线程的标识符。
2)生产者和消费者各有两个以上
3)多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码
(2)设计原理
通过一个有界缓冲区把生产者和消费者联系起来。假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。类似地,只要缓冲区未空,消费者就可以从缓冲区取走产品。应该禁止生产者向未满的缓冲区送入产品,同时也应该禁止消费者从空的缓冲区取走产品,在这一机制下由生产者线程和消费者线程之间的互斥关系来实现。与计算打印两进程同步关系不同,生产者和消费者两进程producer和consumer之间应满足下列两个同步条件:
a)只有在缓冲区中至少有一个缓冲区已存入消息后,消费者才能从中提取信息,否则 消费者必须等待
b)只有缓冲池中至少有一个缓冲区是空时,生产者才能把信息放入缓冲区,否则生产者必须等待。
为了满足第一个同步条件,设置一个同步信号量full,它代表的是缓冲区满,它的初始值为0,它的值为n时整个 缓冲池满。这个资源时消费者进程consumer所有,consumer进程可以申请该资源,对它施加p操作,而consumer进程的合作进程producer对它施加v操作。同样为了满足第二个同步条件,设置另一个同步信号量empty,它代表资源是缓冲空区,它的初始值为n,表示缓冲池中所有缓冲区空。信号量full表示可用缓冲区数量,信号量empty表示缓冲区数量,设置整形变量:存入指针in和取出指针out。
为了解决生产者和消费者问题,应该设置两个资源信号量,其中一个表示空缓冲区的数目,用g_hEmptySemaphore表示,其初始值为有界缓冲区的大小SIZE_OF_BUFFER;另一个表示缓冲区中产品的数目,用g_hFullSemaphore表示,其初始值为0。另外,由于有界缓冲区是一个临界资源,必须互斥使用,所以还需要在设置一个互斥信号量g_hMutex,其初始值为1.
p原语的主要动作是: