生产者--消费者题型(共9页).doc





《生产者--消费者题型(共9页).doc》由会员分享,可在线阅读,更多相关《生产者--消费者题型(共9页).doc(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上三、生产者消费者题型 生产者-消费者题型在各类考试(考研、程序员证书、程序员面试笔试、期末考试)很常见,原因之一是生产者-消费者题型在实际的并发程序(多进程、多线程)设计中很常见;之二是这种题型综合性较好,涉及进程合作、互斥,有时还涉及死锁的避免。生产者-消费者题型可以全面考核你对并发程序的理解和设计能力。生产者-消费者题型最基本的是有界缓冲区的生产者-消费者问题和无界缓冲区的生产者-消费者问题,对这两个问题的解我们应该背下来,就像我们念高中时背一些题型一样。1 有界缓冲区生产者-消费者问题的解前面的课程已多次讲过。假设缓冲区是无界的,试用信号灯 与 PV 操作给出解
2、法。 答:由于是无界缓冲区,所以生产者不会因得不到缓冲区而被阻塞。所以只需在前面的有界缓冲区解中去掉信号量empty及有关的PV操作即可。2. 设有一个可以装A,B两种物品的仓库,其容量无限大,但要求仓库中A,B两种物品的数量满足下述不等式:-MA物品的数量-B物品的数量N,其中M和N为正整数。试用信号灯和PV操作描述A, B两种物品的入库过程。(这是北大1991年研究生入学试题,原题不允许使用条件表达式,解法1虽正确,但不符合原题要求)解1:不等式 -MA物品的数量-B物品的数量N 意味着:A物品的数量-B物品的数量NB物品的数量-A物品的数量M为防止缓冲区存入物品可能发生共享变量错误,A、
3、B入库时需要互斥。解法1ItemType *buffer; /仓库空间semaphore mutex=1; int countA=0, countB=0; /A,B物品初值void putA while(1) P(mutex);if (countA - countB)N *buffer=A; /A入库buffer+; countA+; V(mutex); void putB while(1) P(mutex);if (countB - countA)M *buffer=B; /B入库buffer+; countB+;V(mutex); 解法1借助条件表达式,用简单的互斥解题,与生产者-消费者题
4、型毫无关系。解法2:不使用条件表达式的解法。对于下面表达式A物品的数量-B物品的数量NB物品的数量-A物品的数量M可以这样理解:(1)若只放A而不放B,则A最多放N次便被阻塞,即假定有一个初值为N的信号量S1,A进程每操作一次就相当将信号量S1减1。当S0时,A不能再放,此时每放入一个B(相当于B消费了一件产品),可令S1的信号量加1,此时A有再放的机会。此时A是生产者B是消费者。(2)对B同理。即假定有一个初值为M的信号量S2。此时B是生产者A是消费者。 用这种解题思路,这道题就可归类于生产者-消费者问题。下面我们用思路(1)解这道题。可以认为有一个有界缓冲区,大小为abs(N-M),A是生
5、产者,缓冲区下界是M,其信号量S1=MB是消费者,缓冲区上界是N,其信号量S2=N下面是生产者进程AItemType *buffer; semaphore s1=N, s2=M, mutex=1; void putA while(1) P(s1) /生产一件AP(mutex); *buffer=A; buffer+; V(mutex); V(s2) /通知B进程下面是消费者进程Bvoid putB while(1) P(s2) /生产一件BP(mutex); *buffer=B; buffer+; V(mutex); V(s1) /通知A进程对这道题,我是从生产者-消费者题型来理解的,同学们可
6、能有不同思路。这道题的解与生产者-消费者标准解法的差别在于信号量初值的设定上。后面这个解,把信号量mutex和buffer+去掉也可以,因为这个题只要主要考点不在于互斥。3. 设自行车生产线上有一只箱子,其中有 N 个位置 ( N 3),每个位置可存放一个车架或一个车轮; 又设有三个工人,其活动分别为: 工人 1活动: do 加工一个车架 ; 车架放入箱中 ; while (1) 工人 2活动: do 加工一个车轮 ; 车轮放入箱中 ; while (1) 工人 3活动: do 箱中取一个车架 ; 箱中取二个车轮 ; 组装为一台车 ; while (1) 试分别用信号灯与 PV 操作实现三个工
7、人的合作,要求解中不含死锁。 这是三进程同步问题,属于生产者-消费者题型。首先不考虑死锁问题,显然工人 1与工人3、工人2与工人3构成生产者与消费者关系,这两对生产/消费关系通过共同的缓冲区相联系。从资源的角度来看,箱子中的空位置相当于工人1和工人2的资源,而车架和车轮相当于工人3的资源。定义三个信号灯如下: semaphore empty=N; semaphore wheel=0;semaphore frame=0;三位工人的活动分别为: 工人 1活动: do 加工一个车架 ; P(empty); 车架放入箱中 ; V(frame); while (1) 工人 2活动: do 加工一个车轮
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 生产者 消费者 题型

限制150内