semaphore 写生产者和消费者的程序

光是几个生产者和消费者程序没有问题,但是老师要求还要输出的时候知道哪个消费者拿了哪个产品,这个就不知道怎么写了假设10个消费者,3个生产者,buffer也是3个输出的是第... 光是几个生产者和消费者程序没有问题,但是老师要求还要输出的时候知道哪个消费者拿了哪个产品,这个就不知道怎么写了

假设10个消费者,3个生产者, buffer也是3个

输出的是 第N个消费者拿走了第M个消费者的产品

这个要用java和semaphore来控制的话,怎么控制
展开
 我来答
spaceishere
2010-10-24 · TA获得超过193个赞
知道答主
回答量:147
采纳率:0%
帮助的人:145万
展开全部
先:
1.咱是写C++的,不知道java怎么写,提点建议吧。
2.LZ应该是要表达“第N个消费者拿走了第M个生产者的产品”吧
再:
个人感觉先分个角色。目前题设提及的有
1.消费者。
2.生产者。
3.一个缓冲队列,就是buffer。
4.Task,放在buffer中的任务。
生产消费过程不再赘述。
首先讨论一下用semaphore控制队列。应该是生产者产出了一个“Task”,消费者才会去消费这个任务。所以在buffer的控制上,生产者每向buffer中add一个Task,semaphore+1,消费者始终等待这个semaphore,直到semaphore不为0才到队列中取Task。(从问题中我感觉LZ是想要用semaphore实现“第N个消费者拿走了第M个生产者的产品”,貌似不行,semaphore只是做同步用的,与业务无关)
再来讨论一下实现“第N个消费者拿走了第M个生产者的产品”的问题:
简单一点的做法就是在消费者和生产者身上加上标识ID,当然作为一个Task,应该知道他是哪个生产者生产的,所以要他应该具备一个生产者ID。这样消费者就知道了他取的是哪个生产者的ID。而实现打印“第N个消费者拿走了第M个生产者的产品”在消费者线程中实现。
不过按以上这样做的话,生产者和消费者存在不必要的耦合。因为消费者知道了生产者的存在(所以才会取生产者的ID)。要消除这种耦合,就需要一个管理者。他主要的职责就是控制和分配任务。在这种情况下,生产者和消费者不需要产生自己的ID,他们的ID是管理者分配的。就是说管理者启动了生产者和消费者,并在内部维护两张表,用于管理生产者和消费者。buffer亦应该包含子其中,不过此时buffer也是一张表,记录了Task和其对应的生产者ID。生产者产出一个任务,加到buffer中,管理者分配一个消费者。而管理者分配的任务的过程就是“第N个消费者拿走了第M个生产者的产品”的过程,所以打印这句话的职责就自然而然的在管理者这边了。
按第二种做法的好处在于,一是新增加的管理者可以对之前零散的生产者和消费者进行统一的管理。二是消费者在消费一个Task时候,Task有抽象意义,不是想一开始的那种,好像只是传值的一样。
打个比方,公司是管理者,客户是生产者,工人是消费者。工人做工作不知道他的客户是谁也无所谓,公司平衡了客户和工人之间的生产和消费关系。公司也理应知道哪个客户的工作交给哪个工人了(不然出问题,公司知道怎么维护么?)
后:
一点不成熟的见解,有空一起讨论。我也在学习中~

ps:后来发现题设中说有3个buffer
难道是三个缓冲区?我觉得没有必要,一个就够了。
再后来我估计题设是指的buffer有3个单位吧。这样的话就是要semaphore的最大值为3。在生产者add任务时,如果semaphore为3(就是buffer中有三个Task,buffer满了),add行为就需要等待。
北京金瑞博
2024-08-14 广告
北京金瑞博企业咨询服务有限公司由张磊和合伙人共同创立,专注于为全球制药公司提供法规事务(药品注册)、GMP合规、质量管理数字化、市场准入以及相关工作。我们立志成为国内知名、国际有影响力的专家型咨询公司,为客户合规带来改变,对行业合规产生影响... 点击进入详情页
本回答由北京金瑞博提供
44712283
2010-10-24 · TA获得超过1265个赞
知道小有建树答主
回答量:807
采纳率:0%
帮助的人:598万
展开全部
import java.util.concurrent.Semaphore; class Q { //仓库 int n; //{ //生产者 Q q; Producer(Q q) { this.q = q; new Thread(this,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式