生产者--消费者题型.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
生产者 -- 消费者题型 三、生产者—消费者题型 生产者 --- 消费者题型在各类考试(考研、程序员证书、 程序员面试笔试、 期末考试) 很常见,原因之一是生产者 --- 消费者题型在实际的并发程序(多进程、多线程)设计中很常见;之二是这种题型综合性较好,涉及进程合作、互斥,有时还涉及死锁的避免。生产者 --- 消费者题型可以全面考核你对并发程序的理解和设计能力。 生产者 --- 消费者题型最基本的是有界缓冲区的生产者 消费者问题和无界缓冲区的生产者 --- 消费者问题, 对这两个问题的解我们应该背下来, 就像我们念高中时背一些题型一样。 1 有界缓冲区生产者 - 消费者问题的解前面的课程已多次讲 过。假设缓冲区是无界的,试用信号灯 与 PV 操作给出解法。 答:由于是无界缓冲区,所以生产者不会因得不到缓冲区而被阻塞。所以只需在前面的有界缓冲区解中去掉信号量 empty 及有关的 PV操作即可。 设有一个可以装 A,B 两种物品的仓库,其容量无限大,但要求仓库中 A,B 两种物品的数量满足下述不等式: M ≤A 物品的数量 - B 物品的数量≤ N,其中 M 和 N 为正整数。 试用信号灯和 PV 操作描述 A, B 两种物品的入库过程。(这是北大 1991 年研究生入学试题, 原题不允许使用条件表达式,解法 1 虽正确,但不符合原题要求) 解 1:不等式 - M ≤ A 物品的数量 - B 物品的数量≤ N 意味着: A 物品的数量 - B 物品的数量≤ N B 物品的数量 - A 物品的数量≤ M 为防止缓冲区存入物品可能发生共享变量错误, A 、 入库时需要互斥。解法 1 ItemType *buffer; //仓库空间 semaphore mutex=1; int countA=0, countB=0; //A , B 物品初值 void putA { void putB { while(1){ while(1){ P(mutex); P(mutex); if (countA - countB)N if (countB - countA)M { { *buffer=A; //A 入 *buffer=B; //B 入库 库 buffer++; buffer++; countB++; countA++; } } V(mutex); V(mutex); } } } } 解法 1 借助条件表达式, 用简单的互斥解题, 与生产者 消费者题型毫无关系。 解法 2:不使用条件表达式的解法。对于下面表达式 A 物品的数量 - B 物品的数量≤ N B 物品的数量 - A 物品的数量≤ M 可以这样理解: 1)若只放 A 而不放 B,则 A 最多放 N 次便被阻塞,即假定有一个初值为 N 的信号量 S1,A 进程每操作一次就相当将信号量 S1 减 1。当 S0 时, A 不能再放,此时每放入 3 一个 B(相当于 B 消费了一件产品) ,可令 S1 的信号量加1,此时 A 有再放的机会。此时 A 是生产者 B 是消费者。 ( 2)对 B 同理。即假定有一个初值为 M 的信号量 S2。。。 此时 B 是生产者 A 是消费者。 用这种解题思路,这道题就可归类于生产者 ---- 消费者问 题。下面我们用思路( 1)解这道题。 可以认为有一个有界缓冲区,大小为 abs(N-M) , A 是生产者,缓冲区下界是 M ,其信号量 S1=M B 是消费者,缓冲区上界是 N,其信号量 S2=N 下面是生产者进程 A ItemType *buffer; semaphore s1=N, s2=M, mutex=1; void putA { while(1){ P(s1) //生产一件 A P(mutex); *buffer=A; buffer++; V(mutex); V(s2) //通知 B 进程 } } 下面是消费者进程 B void putB { while(1){ P(s2) //生产一件 B P(mutex); *buffer=B; buffer++; V(mutex); V(s1) //通知 A 进程 4 } } 对这道题,我是从生产者 ---- 消费者题型来理解的,同 学们可能有不同思路。这道题的解与生产者 ---- 消费者 标准解法的差别在于信号量初值的设定上。 后面这个解,把信号量 mutex 和 buffer++ 去掉也可以,因为这个题只要主要考点不在于互斥。 5 3. 设自行车生产线上有一只箱子,其中有 N 个位置 ( N ≥ 3) ,每个位置可存放一个车架或一个车轮 ; 又 设有三个工人,其活动分别为 : 工人 1 活动: 工人 2 活动: 工人 3 活动: do { do { do { 加工一个车架 ; 加工一

文档评论(0)

137****0220 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档